Ruby方法范围?

Ruby方法范围?,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

在以下示例中:

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 = 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
    ),该方法在任何地方都可用在顶层定义的方法成为
    对象的
    私有
    实例方法,而不是
    基本对象