Ruby - 如何不覆盖方法中的实例变量?

时间:2011-01-21 14:41:05

标签: ruby

说我们有这个课程:

class Hello
  def hello
    @hello
  end

  def hello=(hello)
    @hello = hello
  end

  def other_method
    hello = 'hi!'
    ...
  end
end

在这种情况下,

h = Hello.new
h.other_method
puts h.hello
由于将hello =解释为self.hello =

会写'嗨!'。有没有办法避免这种行为,给hello =声明一个方法本地范围(例如,var hello =可以使用javascript代码)?

编辑对不起,我确定因为这个原因我遇到了问题!但现在我还有另外两个问题!

  1. 为什么hello =不被解释为self.hello = ???它被声明为实例方法......

  2. 为什么,即使我写

  3. ...
      def other_method
        self.hello = 'hi!'
      end
    end
    h = Hello.new
    h.other_method
    puts h.hello
    
    它返回nil ???现在它应该是一个明确的任务!

    感谢您的耐心,我有点困惑! : - /

2 个答案:

答案 0 :(得分:2)

实际上这将打印嗨!因为hello = 'hi!'中的other_method会分配给局部变量而不会被解释为self.hello=

如果这不是您所看到的行为,那么您的代码中必须存在您尚未包含在问题中的其他内容。


后续问题的答案:

  1. 在方法identifier = value的主体内分配一个局部变量(不执行方法查找(因此有hello=方法无关紧要。你需要显式的self.调用方法。
  2. 当你写puts h.hello时,它打印'嗨!'这是h.hello的返回值,但随后返回nil,这是puts的返回值。

答案 1 :(得分:0)

它对我有用:

$ irb
irb(main):001:0> class Hello
irb(main):002:1> def hello
irb(main):003:2>   @hello
irb(main):004:2> end
irb(main):005:1> def hello=(hello)
irb(main):006:2>   @hello = hello
irb(main):007:2> end
irb(main):008:1> def other_method
irb(main):009:2>   self.hello = 'hi!'
irb(main):010:2> end
irb(main):011:1> end
=> nil
irb(main):012:0> h = Hello.new
=> #<Hello:0xb746b7cc>
irb(main):013:0> h.other_method
=> "hi!"
irb(main):014:0> puts h.hello
hi!
=> nil