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

时间:2013-04-18 01:22:54

标签: ruby

在Ruby中,与许多语言一样,方法的参数不会自动指定为实例变量。

这有效:

def initialize(a)
  @a = a
end

这不是:

def initialize(@a)
end

例如,在CoffeeScript中,这有效:

constructor: (@name) ->

Ruby中还有很多其他的语法糖,例如||=运算符,符号上的一元&等。是否有任何理由,技术或其他原因,为什么这种糖不是'部分设计?

修改

问题的范围不仅限于initialize

在CoffeeScript中你也可以

class Foo
  baz: (@bar) ->

4 个答案:

答案 0 :(得分:3)

原因是Matz这样决定,至少目前如此。有一个open feature request有不少支持者试图说服马茨。

请注意,通常您应该考虑从Struct.new(:name, ...)继承,它将为您设置默认构造函数,以便设置相应的实例变量,以及访问者,==eql?,{{1等等...

答案 1 :(得分:2)

在Ruby 1.8及更早版本中,块参数使用赋值语义而不是参数绑定语义,因此您可以这样做:

define_method(:initialize) do |@a| end

答案 2 :(得分:1)

在许多语言中,这是不允许的,也不是在Ruby中。例如,在C ++中,您不能直接在构造函数的参数列表中分配成员变量(使用初始化列表仍然需要您手动将参数复制到成员变量)。

我个人认为构造函数体中@a = ainitialize(@a)直接注入对象成员变量更清晰。

答案 3 :(得分:0)

不确定你在追求什么。 Ruby 2之前的Ruby没有命名参数,所以要做你所描述的,你需要传递名称和值。但是在这种情况下你也可以传递一个哈希,这很容易解析,如下所示:https://stackoverflow.com/a/12763031/341994