在 Ruby 中,应用 puts 方法的对象是哪个?

Alb*_*Mar 2 ruby

在 ruby​​ 中,您使用点来调用一个方法,或者换句话说,将一个方法发送到所处理的对象。

"100".to_i
Run Code Online (Sandbox Code Playgroud)

我们正在向对象“100”发送消息 to_i

当我们这样做时:

puts "hello"
Run Code Online (Sandbox Code Playgroud)

方法 puts,应用于哪个对象?

我是这么想的:

self.puts "hello"
Run Code Online (Sandbox Code Playgroud)

self 是主要的地方,比如你现在所处的环境,例如 irb 控制台。

但它会引发错误。

Traceback (most recent call last):
        2: from /Users/albert/.rbenv/versions/2.5.0/bin/irb:11:in `<main>'
        1: from (irb):17
NoMethodError (private method `puts' called for main:Object)
Run Code Online (Sandbox Code Playgroud)

为什么这是错误的?方法 puts 应用在哪里?

更新: Ruby 2.7 允许使用 self 调用私有方法。在12请求并讨论了此功能。

Sch*_*ern 5

puts是 的模块方法KernelKernel包括在内,Object因此几乎每个班级都可以使用它。puts "foo"并且Kernel.puts "foo"是等价的。区别是Kernel.puts明确的,而puts可以调用本地定义的puts方法。

def puts(str)
  p "my puts: #{str}"
end

puts "foo";        # "my puts: foo"
Kernel.puts "foo"  # foo
Run Code Online (Sandbox Code Playgroud)

在幕后,Kernel.puts调用$stdout.puts. $stdout是 的预定义全局实例IO