パーフェクトRuby 読書録

ローカル変数かメソッドか

紛らわしい例。これは以前とあるコミュティーでも質問が出た件。
アクセッサを利用しているつもりがそうならない例。
以来 @val のように明示的にインスタンス変数として参照しているが、最近呼んだ本では、あまり良くない例とされている。クラス内部のメソッドからでも隠蔽したほうが良いのか?

> irb --simple-prompt
>> class Hoge
>>   attr_accessor :val
>>   def test
>>     val
>>   end
>>   def test=(v)
>>     val = v
>>   end
>> end
=> :test=
>> h = Hoge.new
=> #<Hoge:0x3312060>
>> h.val = 10
=> 10
>> h.val
=> 10
>> h.test
=> 10
>> h.test=(20)
=> 20
>> h.test
=> 10
>> h.test = 30
=> 30
>> h.val
=> 10
>>

Fixnum の object_id は数値そのもの?

試してみる

>> '%x' % 0x1000.object_id      
=> "2001"                       
>> '%x' % 0x10000.object_id     
=> "20001"                      
>> '%x' % 0x100000.object_id    
=> "200001"                     
>> '%x' % 0x1000000.object_id   
=> "2000001"                    
>> '%x' % 0x10000000.object_id  
=> "20000001"                   
>> '%x' % 0x100000000.object_id 
=> "186e94c"

確かにそうなっている模様。0x1000000 の次がFixnumとBignumとの境目。

組み込み変数 __dir__

2.0以降で追加された __dir__ だが、便利かも?

*****@*****-PC C:\usr\sandbox
> type test.rb               
puts $0                      
puts __FILE__                
puts __dir__                 

*****@*****-PC C:\usr\sandbox
> ruby test.rb               
test.rb                      
test.rb                      
C:/usr/sandbox

制御構造

  • begin .. end while は do while の動作
  • for v in x の v は for以降でも参照可能(スコープの変化なし)
  • 大域ジャンプは catch / throw
  • begin / rescue / else / ensure ensure 以外は値を返せる