Ruby:将对象分配给变量

时间:2015-08-31 07:08:03

标签: ruby class instance

我有一段我不理解的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的别名?或者这里发生了什么?

3 个答案:

答案 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?
  1. 取消引用常量Struct
  2. 将不带参数的消息name发送到self
  3. 将带有两个参数的消息new发送到1中返回的对象,第一个参数是2中返回的对象,第二个参数是文字字符串"example"
  4. 将3.中返回的对象分配给常量Line
  5. 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 就像这样工作。)