module A
def self.foo
puts "Hi!"
end
foo # Hi!
end
foo # undefined local variable or method `foo' for main:Object (NameError)
class B
def foo
puts "Hey!"
end
new.foo # Hey!
end
B.new.foo # Hey!
foo # still NameError
请注意,单独使用def并不会改变def的作用域:
class C
def foo
def bar
puts "Wat"
end
end
end
C.new.bar # Wat
你可以使用lambda,它是一个类似于方法的对象,存储在局部变量中,因此遵循局部变量作用域规则:
class D
def foo
bar = lambda do
puts "Heyo!"
end
bar[]
end
end
D.new.foo # Heyo!
D.new.bar # undefined method `bar' for #<D:0x0000000105f04280> (NoMethodError)
1条答案
按热度按时间ujv3wf0j1#
def
将方法附加到作用域中的任何类。对于顶级方法,即Object
。由于这是所有内容的基类,因此它使方法在任何地方都可用。为了防止这种情况,你需要引入一个新的作用域,例如打开一个
class
或module
:请注意,单独使用
def
并不会改变def
的作用域:你可以使用lambda,它是一个类似于方法的对象,存储在局部变量中,因此遵循局部变量作用域规则:
缺点是lambda在其他方面的工作方式不同,例如它们如何处理
return
和方法参数,因此将方法转换为lambda可能是不平凡的。