【问题标题】:Calling attribute accessor methods from within the class从类中调用属性访问器方法
【发布时间】:2009-03-14 09:56:14
【问题描述】:

我正在尝试调用我的类属性编写器之一,但由于某种原因它从未被调用。这里有一些代码可以让这更清楚:

class Test
  attr_reader :test

  def test=(val)
    puts 'Called'
    @test = val
  end

  def set_it(val)
    test = val
  end
end

obj = Test.new
obj.set_it 5
puts obj.test
=> nil

最后的 puts 语句输出 'nil'。向 test= 添加调试语句表明它永远不会被调用。我做错了什么?

更新

我部分重写了这个问题,因为我在写这个问题时并没有真正理解这个问题。所以这个问题现在更加笼统了。

【问题讨论】:

标签: ruby


【解决方案1】:

您本身并没有做任何“错误”。 Ruby 只是认为您打算将局部变量 test 设置为 val,而不是调用 test= 方法。 self.test = val 会如你所愿。

【讨论】:

  • 我以为是这样的。我试过 test=(val) 认为这可能会说服 Ruby 我正在尝试调用一个方法。谢谢!
  • 那么无论是否涉及mixin,这都是真的吗?如果没有指定接收者,Ruby 假设您正在设置一个局部变量?有道理。
  • 啊,如果您使用的语言处理方式不同,那么最小意外原则可能会令人惊讶;)谢谢。
【解决方案2】:

这里有一些关于这个(显然是常见的)问题的其他资源:

另一个堆栈溢出问题:Why do ruby setters need “self.” qualification within the class?

来自guys's blog

作为一个 Ruby 新手,你可能曾经做过race = "hooman",但发现它不起作用,然后对自己说:“我不会让这种情况再次发生在我身上。从现在开始,每当我调用一个方法时,我都会在前面加上self.!”

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多