说我们有这个课程:
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代码)?
编辑对不起,我确定因为这个原因我遇到了问题!但现在我还有另外两个问题!
为什么hello =
不被解释为self.hello =
???它被声明为实例方法......
为什么,即使我写
...
def other_method
self.hello = 'hi!'
end
end
h = Hello.new
h.other_method
puts h.hello
它返回nil
???现在它应该是一个明确的任务!
感谢您的耐心,我有点困惑! : - /
答案 0 :(得分:2)
实际上这将不打印嗨!因为hello = 'hi!'
中的other_method
会分配给局部变量而不会被解释为self.hello=
。
如果这不是您所看到的行为,那么您的代码中必须存在您尚未包含在问题中的其他内容。
后续问题的答案:
identifier = value
的主体内分配一个局部变量(不执行方法查找(因此有hello=
方法无关紧要。你需要显式的self.
调用方法。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