【问题标题】:Why does Kernel#p duplicate my text on standard output?为什么 Kernel#p 会在标准输出上复制我的文本?
【发布时间】:2012-12-31 20:45:41
【问题描述】:

看看这段代码:

def hello
   p "Hey!"
end
p hello

输出将是:

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

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

【问题讨论】:

  • 您的代码中没有任何puts。你为什么提到puts
  • @sawa 可能是因为 OP 认为 p 只是 puts 的简写。这不是一个罕见的错误。

标签: ruby io


【解决方案1】:

所有方法都返回一个值

在 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

【讨论】:

    【解决方案2】:

    如果p 方法返回它给出的字符串,那么hello 也会返回它,这意味着第二个p 调用会重复它。

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

    【讨论】:

    • 所以你的意思是 puts 首先将文本发送到输出,然后返回它?为什么?什么时候需要这个? (返回 puts 方法输入)
    • 这正是p 方法的作用。无论如何,您为什么要使用这种方法?它只在irb 内部有用。 puts 是首选的输出方式。
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2022-12-06
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多