ruby方法充当实例方法和类方法

ruby方法充当实例方法和类方法,ruby,Ruby,在irb控制台中,我创建了一个类“Hello” irb(main):001:0> class Hello irb(main):002:1> end => nil 并在“Hello”类之外创建了一个名为“hi”的方法 irb(main):003:0> def hi irb(main):004:1> 'hiiii' irb(main):005:1> end => :hi 现在这个hi方法既是类方法又是实例方法 irb(main):006:0> He

在irb控制台中,我创建了一个类“Hello”

irb(main):001:0> class Hello
irb(main):002:1> end
=> nil
并在“Hello”类之外创建了一个名为“hi”的方法

irb(main):003:0> def hi
irb(main):004:1> 'hiiii'
irb(main):005:1> end
=> :hi
现在这个hi方法既是类方法又是实例方法

irb(main):006:0> Hello.hi
=> "hiiii"
irb(main):007:0> Hello.new.hi
=> "hiiii"
irb(main):008:0> hi
=> "hiiii"
为什么此hi方法是使用类“Hello”进行get调用的,即使它在“Hello”类上下文之外?

在“main”上下文中定义的方法(即不在类或模块声明中)是在对象上定义的。因为每个类,包括(big-C)类,都是从对象继承的,所以方法就存在于每个对象和每个类的继承链中。通过在对象上显式定义方法,可以观察到相同的行为:

class Object
  def foo
    puts "Hello"
  end
end

class Bar; end

Bar.foo
# => Hello

Bar.new.foo
# => Hello

foo
# => Hello
在“main”上下文(即不在类或模块声明中)中定义的方法是在对象上定义的。因为每个类,包括(big-C)类,都是从对象继承的,所以方法就存在于每个对象和每个类的继承链中。通过在对象上显式定义方法,可以观察到相同的行为:

class Object
  def foo
    puts "Hello"
  end
end

class Bar; end

Bar.foo
# => Hello

Bar.new.foo
# => Hello

foo
# => Hello

这里还有一件事在起作用。在顶层定义的方法成为
对象的私有实例方法,这意味着这两个调用都会引发异常“private method called”。但是IRb(并且只有IRb)在这方面的行为与Ruby不同,并将其公开。所以,当且仅当你在IRb中尝试它时,这才有效。这里还有另一件事在起作用。在顶层定义的方法成为
对象的私有实例方法,这意味着这两个调用都会引发异常“private method called”。但是IRb(并且只有IRb)在这方面的行为与Ruby不同,并将其公开。所以,只有当你在IRb中尝试时,这才有效。