方法调用如何工作

Nar*_*ker 1 ruby

如果我调用方法a一次,它只调用外部方法.当我第二次调用它时,它会调用inside方法.

class A
  def a
    puts "outside method"
    def a
      puts "inside method"
    end
  end
end

A.new.a # => outside method
A.new.a # => inside method 
Run Code Online (Sandbox Code Playgroud)

你能解释它是如何工作的吗?

ndn*_*kov 5

原因是嵌套方法始终应用于包含类.第二种方法将被添加到A类中,因为它是第一种方法的包含类.

但是,只有在评估其正文代码时才会添加它,并在首次调用外部方法时对其进行评估.

class Test
  def foo
    puts "outside method"
    def bar
      puts "inside method"
    end
  end
end

test = Test.new
test.methods - Object.methods # => [:foo]
test.foo
test.methods - Object.methods # => [:foo, :bar]
Run Code Online (Sandbox Code Playgroud)

在ruby中,在类中定义具有相同名称的方法两次将覆盖第一个版本.

class Test
  def foo
    "first version"
  end

  def foo
    "second version"
  end
end

test = Test.new
test.foo # => "second version"
Run Code Online (Sandbox Code Playgroud)

因此,在第一次执行之后A#a,内部实现仍然存在.