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

在第二种情况下:

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

我有

String

为什么?我不明白其中的区别。

4

3 回答 3

3

Ruby 将您的第二个示例视为这样

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 中,赋值表达式计算为被赋值的值。

IE:

foo = 'bar'

评估为'bar'

所以,在你的情况下

Item.new.name=("value")

这将更惯用地写成这样:

Item.new.name = 'value'

分配的值是字符串'value'

因此,Item.new.name = 'value'计算结果为'value'(当然还有调用该方法的副作用name=),这意味着

item = Item.new.name = 'value'

评估为

item = 'value'

最后,item有值'value',即 a String

于 2012-07-09T17:35:28.367 回答
0

在第二种情况下,您正在创建一个新项目并设置名称,当您设置名称时,它返回一个字符串,您将其分配给项目变量。你应该使用第一种形式

或者从 ActiveRecord 继承时:

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