ruby方法作为实例方法以及类方法

Gan*_*esh 1 ruby

在irb控制台中我创建了一个类'Hello'

irb(main):001:0> class Hello
irb(main):002:1> end
=> nil
Run Code Online (Sandbox Code Playgroud)

并在'Hello'类之外创建了一个名为'hi'的方法

irb(main):003:0> def hi
irb(main):004:1> 'hiiii'
irb(main):005:1> end
=> :hi
Run Code Online (Sandbox Code Playgroud)

现在这个hi方法充当类方法和实例方法

irb(main):006:0> Hello.hi
=> "hiiii"
irb(main):007:0> Hello.new.hi
=> "hiiii"
irb(main):008:0> hi
=> "hiiii"
Run Code Online (Sandbox Code Playgroud)

为什么这个hi方法是使用类'Hello'调用,即使它在'Hello'类上下文之外?

Jor*_*ing 6

在"主"上下文中定义的方法(即不在类或模块声明中)在Object上定义.由于每个类(包括(big-C)Class)都继承自Object,因此该方法存在于每个对象和每个类的继承链中.您可以通过在Object上显式定义方法来观察相同的行为:

class Object
  def foo
    puts "Hello"
  end
end

class Bar; end

Bar.foo
# => Hello

Bar.new.foo
# => Hello

foo
# => Hello
Run Code Online (Sandbox Code Playgroud)

  • 这里还有另一件事.在顶层定义的方法成为`Object`的*private*实例方法,这意味着这两个调用*应该*引发异常"私有方法".**但是**IRb(和***IRb)在这方面与Ruby的行为不同,并且公开.因此,当且仅当您在IRb中尝试时,此功能才有效. (2认同)