代码之家  ›  专栏  ›  技术社区  ›  Silvio Mayolo

在顶级方法中,“self”的规则是什么?

  •  3
  • Silvio Mayolo  · 技术社区  · 6 年前

    如果我在Ruby文件中定义顶级方法,那么 self 似乎很大程度上取决于谁给它打电话。

    def who_am_i
      puts self.inspect
    end
    
    class A
      def self.foo
        who_am_i
      end
      def foo
        who_am_i
      end
    end
    
    def foo
      who_am_i
    end
    
    foo       # >> main
    A.foo     # >> A
    A.new.foo # >> #<A:...>
    

    显然,如果定义了一个方法 在里面 一个班, 自己 将是类本身(对于类方法)或类的相关实例(例如,方法)。根据上面的试验,似乎 在类继承中定义 自己 但我找不到任何官方的参考资料或任何可以证明这一点的东西。有人能提供一个描述这种行为的官方资料来源,以及为什么它会以这种方式工作的理想理由吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Sergio Tulentsev    6 年前

    main Object self

    private_methods.include?(:who_am_i) # => true
    foo       # => "main"
    A.private_methods.include?(:who_am_i) # => true
    A.foo    # => "A"
    A.new.private_methods.include?(:who_am_i) # => true
    A.new.foo # => "#<A:0x00007feaad034e00>"
    
        2
  •  1
  •   jedi    6 年前
        3
  •  1
  •   Nondv    6 年前

    main

    main_obj = Object.new
    main_obj.instance_eval do
      # your program goes here
    
      # this defines method on `main_obj` singleton class
      def f
        puts 123
      end
    
      f
    end
    

    this question