2

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

这有效:

def initialize(a)
  @a = a
end

这不会:

def initialize(@a)
end

例如,在 CoffeeScript 中,这是有效的:

constructor: (@name) ->

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

编辑

问题的范围不限于initialize.

在 CoffeeScript 你也可以做

class Foo
  baz: (@bar) ->
4

4 回答 4

3

原因是马茨是这样决定的,至少现在是这样。有相当多的支持者试图说服 Matz有一个开放的功能请求。

请注意,您通常应该考虑从Struct.new(:name, ...)哪个继承定义一个默认构造函数,以便您设置相应的实例变量,以及访问器、==eql?hash等...

于 2013-05-16T05:46:03.640 回答
2

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

define_method(:initialize) do |@a| end
于 2013-04-18T01:34:18.763 回答
1

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

我个人认为@a = a在构造函数体中比initialize(@a)直接注入到对象成员变量中更干净。

于 2013-04-18T01:37:16.763 回答
0

不知道你在追求什么。Ruby 2 之前的 Ruby 没有命名参数,因此要执行您所描述的操作,您需要同时传递名称和值。但在这种情况下,您不妨传递一个哈希,解析起来很简单,如下所示:https ://stackoverflow.com/a/12763031/341994

于 2013-04-18T01:30:48.207 回答