「Ruby」カテゴリーアーカイブ

クラス定義内では、setter=は、メソッド呼び出しではなくローカル変数への代入とみなされる

「プログラミング Ruby 第2版」p142より
クラス定義内では、setter=は、メソッド呼び出しではなくローカル変数への代入とみなされる。メソッド呼び出しであることを示すには、self.setter=を使う。

class Incorrect
  attr_accessor :one, :two
  def initialize
    one = 1 # 間違い。これではローカル変数への代入とみなされる
    self.two = 2
  end
end
obj = Incorrect.new
obj.one → nil
obj.two → 2

==、eql?、equal?

equal? は、同一オブジェクトの場合にtrue
Object#equal?(other) は決してオーバーライドされない。これは、otherと同一オブジェクトの場合、つまりobject_idが等しい場合のみ、trueを返す。
== と eql? は、等価の場合にtrue
一方、==とeql?は、各サブクラスによってオーバーライドされる。
通常は、==とeql?はともに、等価の場合にtrueを返すが、例外としてNumericタイプでは、以下のように==とeql?は異なる。
例外としてNumericタイプでは、==とeql?は異なる
Class: Numeric

1 == 1.0          #=> true
1.eql?(1.0)       #=> false
(1.0).eql?(1.0)   #=> true

ヒアドキュメント (行指向文字列リテラル)

Rubyリファレンスマニュアル - リテラル

<<識別子' を含む行の次の行から `識別子' だけの行の直前までを文字列とする。

ヒアドキュメントでは、開始ラベル `<<識別子' が文法要素としての式にあたります。これは、開始ラベルを使ってヒアドキュメント全体を引数に渡したりレシーバにしたりすることができるということを意味します。

開始ラベルを `<<-識別子' のように `-' を付けて書くことで終端行をインデントすることができます。

一行に複数のヒアドキュメントを書くこともできます。

開始ラベル `<<識別子' の `識別子' を(""、''、``)のいずれかで囲むことで、ヒアドキュメントとなる文字列リテラルの性質は対応する文字列リテラルと同じ扱いになります。

ブレースはdo/endよりも結合力が強い

def one(arg)
  if block_given?
    "block given to 'one' returns #{yield}"
  else
    arg
  end
end
def two
  if block_given?
    "block given to 'two' returns #{yield}"
  else
    "no block given to 'two'"
  end
end
# ブロックはtwoに関連付けられる
result1 = one two {
  "three"
}
# ブロックはoneに関連付けられる
result2 = one two do
  "three"
end
result3 = one two
puts "With braces, result = #{result1}"
puts "With do/end, result = #{result2}"
puts "With no block, result = #{result3}"
出力結果:
With braces, result = block given to 'two' returns three
With do/end, result = block given to 'one' returns three
With no block, result = no block given to 'two'