Ruby方法范围?
在以下示例中: Main.rbRuby方法范围?,ruby,methods,scope,Ruby,Methods,Scope,在以下示例中: Main.rb def main obj = ExampleClass.new def multiply(a, b, c, d) return a * b * c * d end puts obj.multiply(1, 2, 3, 4) # this prints 24 end main class ExampleClass def initialize end end ExampleClass.rb def main obj = Ex
def main
obj = ExampleClass.new
def multiply(a, b, c, d)
return a * b * c * d
end
puts obj.multiply(1, 2, 3, 4) # this prints 24
end
main
class ExampleClass
def initialize
end
end
ExampleClass.rb
def main
obj = ExampleClass.new
def multiply(a, b, c, d)
return a * b * c * d
end
puts obj.multiply(1, 2, 3, 4) # this prints 24
end
main
class ExampleClass
def initialize
end
end
为什么
multiply
方法现在是obj
实例的一部分?(main
方法不是ExampleClass
定义的一部分)可能是因为变量obj
和定义方法multiply
的上下文都有对象作为父/祖先
如果调用obj.class
,您将得到ExampleClass
。假设您在控制台中,如果调用self.class
,您将得到Object
。因此,在您的代码中,为Object
类定义了一个方法multiply
。这就是为什么multiply
是obj
实例的一部分。在没有附加类的情况下编写的代码。。结束
,模块。。end
enclosures在特殊main
对象的上下文中一步一步地直接执行。可以使用以下方法引用此对象:
2.2.2 :001 > self
# => main
没有附加类/模块定义的方法被定义为main
对象的私有方法,因此,在Ruby中几乎是任何其他对象的私有方法:
2.2.2 :002 > def foo
2.2.2 :003?> 42
2.2.2 :004?> end
# => :foo
2.2.2 :005 > foo
# => 42
2.2.2 :006 > [].foo
# => NoMethodError: private method `foo' called for []:Array
2.2.2 :007 > [].send :foo
# => 42
因此,在代码中,main
方法(也可以是任何其他方法)位于main
对象的上下文中,因此可以从ExampleClass.new
或Array.new
或任何其他类调用multiply
方法
资料来源:
更新
从他的评论中很少有注释
这在main中不是私有方法,而是BasicObject的私有方法(在2.0-2.2中)
截至第2.3节(以及第1.9.3节),该方法甚至没有私有化
它不必是类的实例,例如类。new
,因为类本身也将定义此方法,例如BasicObject.foo
在脚本范围内定义的方法成为对象的私有实例方法。(除了在IRb中,它们成为对象的公共实例方法
)
因此,main
是Object
的私有实例方法
方法中的方法定义不创建嵌套方法,即multiply
不嵌套在main
中。相反,每次调用main
,都会创建一个名为multiply
的新方法,作为Object
的实例方法。出于某种我不太清楚的原因,它最终成为了一种公共方法
因此,发生的情况如下:
您将main
定义为Object
您可以调用main
,这将反过来定义multiply
作为Object
调用multiply
,这是因为obj
是ExampleClass
的一个实例,它是Object
的一个子类,具有multiply
方法
主方法没有包装在ExampleClass中。那么什么是ExampleClass
?提供一些ExampleClass
的代码ExampleClass
是一个空类,我在中添加了它。@aoiee更新了答案。希望有帮助。注意1)这不是main
中的私有方法,而是BasicObject
的私有方法(在2.0-2.2中)。2) 截至第2.3节(以及第1.9.3节),该方法甚至没有私有化。3) 它不需要是类的实例,例如class.new
,因为类本身也将定义此方法,例如BasicObject.foo
nice简明(高级)解释此方法如何工作main
中定义的方法排序(不是OP定义的方法,而是对象main
)自动添加为BasicObject
的实例方法,因为每个对象都直接或间接地从BasicObject
继承。只要接收对象没有定义特定于对象的方法版本(也没有任何祖先一直到BasicObject
),该方法在任何地方都可用在顶层定义的方法成为对象的私有实例方法,而不是基本对象
。