【问题标题】:How method call works方法调用的工作原理
【发布时间】:2015-12-25 17:52:11
【问题描述】:

如果我调用一次方法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 

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    原因是嵌套方法总是应用于包含类。第二个方法将被添加到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]
    

    在 ruby​​ 中,在一个类中定义同名方法两次将覆盖第一个版本。

    class Test
      def foo
        "first version"
      end
    
      def foo
        "second version"
      end
    end
    
    test = Test.new
    test.foo # => "second version"
    

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

    【讨论】:

    • 做这样的事情难道不是坏习惯吗?
    • @c650,主要是 - 是的。当然有应用程序,但如果你没有非常令人信服的理由,你不应该在你的日常代码中这样做。
    • 是这样想的。尤其是同名...但是我想如果您希望某个版本的方法只能运行一次,这很实用。
    【解决方案2】:

    这里没有内部或外部方法。 There are no nested methods 在 Ruby 中。

    您拥有的是一个方法,当您调用它时,将定义一个方法,而该方法恰好覆盖了该方法。注意警告!

    A.new.a
    # outside method
    # warning: method redefined; discarding old a
    # warning: previous definition of a was here
    
    A.new.a
    # inside method
    

    永远不要忽略警告!有时他们是错的,但通常,他们会告诉你一些事情。你应该经常检查它们。

    【讨论】:

      【解决方案3】:

      没什么特别的。遵循方法定义。

      • 在调用A.new.a之前:类体被执行。
        • a定义为外部a
      • A.new.a的第一次调用:外部a的方法体被执行。
        • 打印"outside method",然后
        • a定义为内部a
      • 第二次调用A.new.a:内部a的方法体被执行。
        • 打印"inside method"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        相关资源
        最近更新 更多