【问题标题】:Ruby. Symbol '=' in to the setter name and initialization of an object红宝石。设置器名称和对象初始化中的符号“=”
【发布时间】:2012-07-09 03:24:25
【问题描述】:
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
为什么?我不明白其中的区别。
【问题讨论】:
标签:
ruby
object
setter
initializer
【解决方案1】:
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"
【解决方案2】:
在 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。
【解决方案3】:
在第二种情况下,您正在创建一个新项目并设置名称,当您设置名称时,它会返回一个字符串,您将其分配给项目变量。
你应该使用第一种形式
或者从 ActiveRecord 继承时:
item = Item.new(:name=>"value")