-1

看看这段代码:

def hello
   p "Hey!"
end
p hello

输出将是:

"Hey!"
"Hey!"
=> "Hey!"

所以这是我的结论: puts 自身返回将在 Ruby 代码输出中发送的文本,否则它不会打印“嘿!” 再次。打印字符串时发生了什么?如果 puts 不直接将其发送到标准输出,谁负责,如何负责?

4

2 回答 2

5

所有方法都返回一个值

在 Ruby 中,几乎所有东西都会返回一个值,即使该值是nil。但是,在您的情况下,问题是Kernel#pKernel#puts的返回值不同。

def hello
   # Print string literal, then return
   # the printed object.
   p "Hey!"
end

# Print the return value of main#hello.
p hello

结果,字符串在方法内被打印一次,然后方法的返回值被传递给 Kernel#p 并再次打印。这是设计使然。

使用 Kernel#puts 避免重复输出

def hello
   # Print string; return nil.
   puts "Hey!"
end

# Calls main#hello, but prints nil (blank line).
puts hello

这将导致在方法内部打印字符串文字,然后打印一个空行,因为该方法的返回值为 nil。

Hey!

=> nil

正确的方式

如果要避免出现空行,请避免多次发送到标准输出。例如:

def hello
  'Hey!'
end

p hello
于 2012-12-31T21:06:23.873 回答
2

如果该p方法返回它给出的字符串,那么hello也将返回它,这意味着辅助p调用将重复它。

这可能是默认puts返回的原因。nil

于 2012-12-31T20:47:53.737 回答