为什么方法参数不适用于赋值?

在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