とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

Ruby 2.0の機能解説メモ(NilClass)

  * NilClass
    * added method:
      * added nil.to_h which returns {}
  • 追加されたメソッド
    • NilClass#to_h

nilに対してto_hを呼ぶと空のハッシュが返ってくるようになった。
これにて、nil.to_aやnil.to_sと同じような動きになったらしい。
#いままでだとnil.to_hとかするとNoMethodErrorだった

pry(main)> {}.to_h
NoMethodError: undefined method `to_h' for {}:Hash
from (pry):1:in `__pry__'

Ruby 2.0の機能解説メモ(LoadError)

  * LoadError
    * added method:
      * added LoadError#path method to return the file name that could not be
        loaded.
  • 追加されたメソッド
    • LoadError#path

ロードできなかったファイルの名前を返す。


何がどうなってるのかよくわからないが、pryで確認してもnilしか得られなかった。
・・・そのうち分かる日が来るのかな?

pry(main)> le = LoadError.new
=> #<LoadError: LoadError>
pry(main)> le.path
=> nil

Ruby 2.0の機能解説メモ(Kernel)

久しぶり更新。


社内の読書会でRuby 2.0のリリースノートを読んで2.0の新機能を学ぼうという提案が通った。
自分の担当部分を軽くまとめておく。

  * Kernel
    * added method:
      * added Kernel#Hash conversion method like Array() or Float().
      * added Kernel#__dir__ which returns the absolute path of the
        directory of the file from which this method is called.
      * added Kernel#caller_locations which returns an array of
        frame information objects.
    * extended method:
      * Kernel#warn accepts multiple args in like puts.
      * Kernel#caller accepts second optional argument `n' which specify
        required caller size.
      * Kernel#to_enum and enum_for accept a block for lazy size evaluation.
    * incompatible changes:
      * system() and exec() closes non-standard file descriptors
        (The default of :close_others option is changed to true by default.)
      * respond_to? against a protected method now returns false unless
        the second argument is true.
      * __callee__ has returned to the original behavior, and now
        returns the called name but not the original name in an
        aliased method.
      * Kernel#inspect does not call #to_s anymore
        (it used to call redefined #to_s).
  • 追加されたメソッド
    • Kernel#Hash

Array()とかFloat()と同じようにHashもできるようになる。
Array()の説明を見ると多分to_h()メソッドがあるオブジェクトを渡すとHashにしてくれる模様。
・・・to_h()メソッド呼べるオブジェクト少なくない?
なのでサンプルはNilClass。

pry(main)> Array(1..3) # 1.9系でも可能
=> [1, 2, 3]
pry(main)> Hash(nil)   # 2.0系で可能
=> {}
    • Kernel#__dir__

__dir__メソッドを呼んだファイルの絶対パスを表示してくれる

puts __dir__
% ruby __dir__.rb
/tmp/ruby2
    • Kernel#caller_locations

スタックに積まれたメソッドの呼び出し元を配列として返してくれる。

  1 def fiz
  2   baz
  3 end
  4 
  5 def baz
  6   p caller_locations
  7 end
  8 
  9 fiz
% ruby caller_locations.rb
["caller_locations.rb:2:in `fiz'", "caller_locations.rb:9:in `
'"]
  • 拡張されたメソッド
    • Kernel#warn

#putsみたいに複数の引数を受け取れるようになった

 1 warn "fiz", "buz"
% ruby warn.rb
warn.rb:1:in `warn': wrong number of arguments(2 for 1) (ArgumentError)
	from warn.rb:1:in `
'
% ruby warn.rb
fiz
buz
    • Kernel#caller

呼び出し元の情報ををバックトレース(文字列の配列)として返すにあたり、範囲が指定できるようになった。

  1 #encoding: utf-8
  2 
  3 def foo
  4   p caller(0)    # 1.9系でも可能
  5   p caller(0, 1) # 2.0系で可能
  6 end
  7 
  8 def bar
  9   foo
 10 end
 11 
 12 bar

% ruby caller.rb
["caller.rb:4:in `foo'", "caller.rb:9:in `bar'", "caller.rb:12:in `<main>'"]
["caller.rb:5:in `foo'"]

Enumerator#lazyに対応・・・でいいのかな?

    • 互換性のないメソッド
      • Kernel#system()
      • Kernel#exec()

スタンダードではないファイルのディスクリプタを閉じる
#スタンダードじゃないファイルって何?

      • Kernel#respond_to?

protectedのメソッドが定義されているかどうかを調べる際に、第二引数にtrueを付けないとfalseになる。

  1 module Kernel
  2   def hoge
  3     "hoge"
  4   end
  5   protected :hoge
  6 end
  7 
  8 puts hoge
  9 puts respond_to? :hoge
 10 puts respond_to? :hoge, true
% ruby respond_to.rb
hoge
true
true
% ruby respond_to.rb
hoge
false
true
      • Kernel#__callee__

2.0以前はエイリアスされたメソッド名ではなく、元のメソッド名を表示していたが、2.0からはエイリアスされたメソッド名を返すようになった。

  1 class Foo
  2   def bar
  3     puts __callee__
  4   end
  5   alias foo bar
  6 end
  7 
  8 obj = Foo.new
  9 obj.foo
 10 obj.bar
% ruby __callee__.rb
bar
bar
% ruby __callee__.rb
foo
bar
      • Kernel#inspect

再定義された#to_sを呼ぶから#to_sを呼ばなくなったらしい。
結局#to_s呼んでるし、最初から再定義された#to_sを呼ぶって書けばいいんじゃ・・・

「Objective-C プログラミング」を献本していただきました

今年に入って知り合いがObjective-Cの本に関する翻訳をしていて、そのレビューに参加させていただいた。
あまりお手伝いできなかったのだけれども、Objective-Cの勉強をさせてもらいながら幾つかコメントを出したりしていたが、先月末にようやく発売されました!

Objective-C プログラミング
Aaron Hillegass アーロン・ヒレガス
ピアソン桐原
売り上げランキング: 21832


内容は初心者向けのObjective-C(+C言語)について書かれたもので、初心者向けの本としてはかなり丁寧に書かれています。(あと訳者の補足もすごく丁寧に書かれています)
iPhoneiPad向けのアプリを作りたいだけの方には向いていないかもしれませんが、Objective-Cの基礎から押さえて今後につなげるためには最適な本です。


個人的には訳者補記がかなり手厚くてレビュー後に追加されたその部分については本をもらってから読みましたがある意味本文よりもそちらのほうが面白かったりします。


また、サポートページも解説されておりそちらの方で訳者からのサポートや正誤表が得られます。
『Objective-Cプログラミング THE BIG NERD RANCH GUIDE』サポートページ


私はレビューでひと通り読ませていただいたものの個人的に買う気まんまんでしたが、お手伝いしたということでサイン付きで献本していただいた。


謝辞のところに私の名前も載っていますので、ぜひObjective-Cプログラミングをお買い上げください。

水槽作り(続き)

前回からかなり日が空いてすでに水槽は立ち上がっているのだがあえて続きから書く。


前回砂をいれて濁っていたところをお見せしたがフィルタを動かして一晩立つとこうなる。


そこにライブロックを放り込む。
で、今回はここにさらに砂を導入(前回の段階で届かなかった物)


この砂は最初にいれた砂よりも粒が大きくなっているので、魚の住み分けができるかもと思っていれることにした。


で、いれてみたらこんなん出てきた。


なんでやねん・・・
とりあえず頭にきたのでレビューにこれと他にもアルミ片みたいなのが入って残念と書いておいた。


気を取り直して作業再開。
砂を半分だけいれてやるとこんな感じ。



あとは水質が安定するまで放置。
前回は1週間ぐらいで生体を投入したので今回もその辺を目安にするつもり。

vs へんなおっちゃん

海浜公園のBBQ場で友達とサンマを焼いてきた。


海浜公園ということで近くに海があり、貝殻が拾えるので一人巻貝を探すことに。

水槽で飼っているヤドカリの殻が最近狭そうなので浜辺で拾おうと探していたが見つからない。


そろそろ帰ろうとしてるところで見知らぬおっちゃんに「なにしてるんやー」と声をかけられる。


家で買ってきたヤドカリを飼育していて、その殻が狭くなってきたから替えの殻を探しているという説明をしたところ。


おっちゃん「ヤドカリ!飼えるの!?」


「ええ、飼えますよ。」


おっちゃん「ここの海岸で捕まえたの?」


「いえ、お店で買いました。」
(さっき言いましたよね。)


おっちゃん「でもいつか死ぬよね?」


「そりゃ生き物ですからいつか死にますよ。」
(あんたもおれもそのうち死んじゃうでしょ?)


おっちゃん「お兄ちゃんいい匂いするね!」


(えっ、なにこのおっちゃんキモい!?)


おっちゃん「お兄ちゃんお酒のんだでしょ?」


「ああ、そこでサンマ焼いてお酒飲んでましたから。」


おっちゃん「お酒飲んでると思った!いい匂いするんだもん!」


(そういうことか・・・)


「じゃあそろそろ私は片付けもあるし戻りますんで!」


なんかやばい予感がしたので帰ろうとしたのだが「もうちょっとお話しようよ〜」と言って両腕を両手で掴まれた。


ヤバイ、マジでこのおっちゃんやばいかも知らん。


そんな私の思いを無視しておっちゃんは両腕を持ったまま「お兄ちゃんいい体してるね〜」と言って掴んだ腕を離して、胸を触ってきた。


本当にヤバイ。
今すぐ逃げたい!!


でもまだまだおっちゃんは絡んでくる。


おっちゃん「お兄ちゃん体重いくつ?身長も高いでしょ?」


体重は66kgで身長は170cmですよ。


おっちゃん「66kg?もっとあるでしょー?70kgとか。身長もおっちゃん158cmやけど見上げなあかんから30cmは違うと思うんだよ」


このおっちゃんは私の体重を勝手に増やしてどうしたいんだ?あと、身長が30cmも上だと私の身長は190cm近くなるぞ?


そしてまた「いい体してるよね〜」と言っておっちゃんが胸を触ってきたので「セクハラで訴えますよ」と笑顔で牽制。


結局この危ないおっちゃんとこのあと5分ぐらい話してお別れ。


いや、マジて変なおっちゃんだったが無事にお別れできて良かった・・・