2012-07-09 81 views
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 

为什么?我不明白区别。

回答

3

红宝石看到你的第二个例子作为赋值运算符的这个

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" 
0

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

,或者当来自ActiveRecord的继承:

item = Item.new(:name=>"value") 
1

在Ruby中,赋值表达式求值为正在分配的值。

即:

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',这是String

+1

我们的答案像双胞胎:) – 2012-07-09 17:37:05