最后的表达式在Ruby中评估

时间:2015-03-22 22:52:37

标签: ruby

我有这个类定义:

class Test
  attr_accessor :state

  def multiple_state=(times)
    @state *= times
  end
end

obj = Test.new
obj.state = 2
puts #{obj.multiple_state=4}

我认为输出是8,因为它是最后一个的值 表达式在multiple_state中计算。 (?)

但输出是4。

我对最后一个表达的理解是错误的吗?

感谢。

1 个答案:

答案 0 :(得分:5)

Ruby的setter方法的语法糖总是返回赋值的右侧,即使你在方法中做了其他事情。有条不紊的Rubyist比我更好:

  

Setter方法不会返回您的想法。当你使用   语法糖,让你调用=看起来像赋值的方法,   Ruby认真对待赋值语义。作业(如x = 1)   评估他们右侧的任何东西。方法通常返回   执行期间评估的最后一个表达式的值。但是=方法调用   表现得像赋值:表达式ticket.price = 63.00的值是   63.00,即使ticket =方法返回字符串"哈哈!"。这个想法是   保持语义一致。在引擎盖下,这是一个方法调用;但它看起来   就像一个任务一样,行为就像一个关于它的价值的任务   表达。

有根据的Rubyist - 第3.3.3章