0
class Item

    def name=(name_value)   
        @name = name_value
    end

    def name
        @name
    end

end

最初のケースでは:

item = Item.new
item.name=("value")
puts item.class

私は取得し続けます。

Item

2 番目のケースでは:

item = Item.new.name=("value")
puts item.class

私は持っている

String

なんで?違いがわかりません。

4

3 に答える 3

3

Rubyはあなたの2番目の例を次のように見ています

item = Item.new.name = 'value'

代入演算子の戻り値は、代入される値です。Item.new.name = 'value'返品'value'も承りますitem = 'value'

class Item
  def name=(name_value)
    @name = "processed #{name_value}"
  end

  def name
    @name
  end
end

item = Item.new
item2 = item.name = "value" # your example code

item2 # => "value"
item.name # => "processed value"
于 2012-07-09T17:33:50.430 に答える
1

Ruby では、代入式は代入される値に評価されます。

すなわち:

foo = 'bar'

に評価されます'bar'

だから、あなたの場合

Item.new.name=("value")

これは、より慣用的に次のように記述されます。

Item.new.name = 'value'

割り当てられる値は string'value'です。

したがって、 (もちろん、メソッドを呼び出すという副作用があります) にItem.new.name = 'value'評価されます。つまり、次のことを意味します。'value'name=

item = Item.new.name = 'value'

に評価されます

item = 'value'

そして最後にitem、値は です。'value'これはStringです。

于 2012-07-09T17:35:28.367 に答える
0

2番目のケースでは、新しいアイテムを作成して名前を設定しています。名前を設定すると、アイテム変数に割り当てる文字列が返されます。最初の形式を使用する必要があります

または ActiveRecord から継承する場合:

item = Item.new(:name=>"value")
于 2012-07-09T17:26:27.583 に答える