为什么方法参数不适用于赋值?
在Ruby中,与许多语言一样,方法的参数不会自动分配为实例变量。
这有效:
def initialize(a) @a = a end
这不是:
def initialize(@a) end
例如,在CoffeeScript中,这有效:
constructor: (@name) ->
Ruby中还有很多其他的语法糖,例如||=
运算符,一元符号&
符号等。是否有任何理由,技术或其他原因,为什么这种糖不是设计的一部分?
编辑
问题的范围不仅限于initialize
。
在CoffeeScript中你也可以这样做
class Foo baz: (@bar) ->
原因是Matz决定这样做,至少目前如此。 有一个开放的function请求 ,有不少支持者试图说服马茨。
请注意,通常您应该考虑从Struct.new(:name, ...)
inheritance, Struct.new(:name, ...)
为您设置相应的实例变量以及访问器, ==
, eql?
的默认构造函数eql?
, hash
等…
在Ruby 1.8及更早版本中,块参数使用赋值语义而不是参数绑定语义,因此您可以这样做:
define_method(:initialize) do |@a| end
在许多语言中,这是不允许的,也不是在Ruby中。 例如,在C ++中,您不能直接在构造函数的参数列表中分配成员变量(使用初始化列表仍然需要您手动将参数复制到成员变量)。
我个人认为它更清晰,在构造函数体中使用@a = a
而不是initialize(@a)
直接注入对象成员变量。
不确定你在追求什么。 Ruby 2之前的Ruby没有命名参数,因此要执行您所描述的内容,您需要传递名称和值。 但在这种情况下,你可能会传递一个哈希,这很简单,解析,如下所示: https : //stackoverflow.com/a/12763031/341994