我有一段我不理解的Ruby代码:
Line = Struct.new(name, "example") // what happens here?
def foo(lines)
lines.map { |z|
Line.new(name, z[:specific]) // equal to 'Struct.new'?
}
end
这是否意味着Line
现在是Struct
的别名?或者这里发生了什么?
答案 0 :(得分:1)
Line
是新类,由Struct.new
返回。 Struct
是一个帮助器类,它允许您使用访问器方法轻松创建具有名称作为其构造函数参数的字段的类。一开始可能会让人感到困惑,但在Ruby类中只是另一种类型的对象,所以它们可以通过方法创建。
您可以参考Struct
的工作原理:
http://ruby-doc.org/core-2.2.2/Struct.html
答案 1 :(得分:1)
Struct
只是这个类的简写符号:
class Line
def initialize(example, name)
@example = example
@name = name
end
def name=(name)
@name = name
end
def name
@name
end
def example=(example)
@example = example
end
def example
@example
end
end
当您看到Line.new
时,只需将其视为Line
类的实例。 Sruct
只是创建Line
类的更快捷方式。
答案 2 :(得分:0)
这是否意味着
Line
现在是Struct
的别名?
没有。这就像是
Line = Struct
Line = Struct.new(name, "example") // what happens here?
Struct
name
发送到self
new
发送到1中返回的对象,第一个参数是2中返回的对象,第二个参数是文字字符串"example"
Line
Line.new(name, z[:specific]) // equal to 'Struct.new'?
不,那不是Ruby中的作业分配方式。在Ruby中,您没有为变量分配表达式,表达式首先被评估 ,然后然后该评估的结果被分配给变量一次。
即。如果你做了像
这样的事情foo = gets
gets
不一次又一次地被调用,每次取消引用foo
时,当您分配给{时,它会被称为一次 {1}}然后foo
包含对foo
返回的对象的引用。
此外,即使如果它的效果就像你认为的那样,那么它仍然不等于gets
而是等于{ Struct.new
,因为 表达式位于Struct.new(name, "example").new
赋值的右侧(但是,就像我说的那样,没有& #39; t 就像这样工作。)