Ruby初始化和自我

时间:2012-04-10 14:59:22

标签: ruby metaprogramming

我发现了一个有趣的问题:http://rubeque.com/problems/fixing-bad-code-the-wrong-way/solutions

通常我们有一个简单的类(注意我们这里没有attr_accessor):

class Foo
  def itnialize(name)
    self.foo = name
  end

  def set_bar 
    self.bar = 'it will fail..'
  end
end

我认为当我调用Foo.new时,ruby不会引发任何方法错误,但它会毫无问题地通过。当我尝试Foo.new.bar

时,代码将失败

如何可能以及如何访问Foo.new.foo变量?

1 个答案:

答案 0 :(得分:4)

你有一个拼写错误,拼写错误initializeitnialize所以它不会被调用 - 所以没有错误。

看起来您正在尝试创建一个实例变量 - 为此,您需要在某处使用@前缀来定义它。所以你可以这样做:

def initialize(name)
  @foo = name
end

这意味着您可以在课堂内访问@foo

self.foo只能引用方法 foo,因此如果要显式或使用其中一个方法调用它,则需要定义该方法attr变体。

然而,在这种情况下,你可以做到

def set_bar
  @bar = 'it will succeed!'
end