【问题标题】:What condition is my Ruby conditional in?我的 Ruby 有条件是什么条件?
【发布时间】:2017-01-14 17:19:42
【问题描述】:

以下条件语法在不使用puts的情况下在irb中显示字符串'is true'

irb(main):001:0> if true
irb(main):002:1>   'is true'
irb(main):003:1> else
irb(main):004:1*   'is false'
irb(main):005:1> end
=> "is true"

...然而,当我在脚本中调用相同的语法并从命令行运行它时,它会被忽略。为什么?

# Odd behaviour:
puts "Why do only two of the three conditionals print?"

# This doesn't put anything to screen:
if true
  'is true_1'
else
  'is false'
end

puts "Seriously, why? Or better yet: how?"

# But this does:
if true
  puts 'is true_2'
else
  puts 'is false'
end

# And this works without "puts":
def truthiness
  if 1.send(:==, 1)
    'is true_3'
  else
    'is false'
  end
end

puts truthiness
puts "Weird."

当我将它作为脚本运行时,它会显示:

"Why do only two of the three conditionals print?
Seriously, why? Or better yet: how?
is true_2
is true_3
Weird."

FWIW,我正在关注 Sandi Metz 的演讲“Nothing is Something” https://youtu.be/zc9OvLzS9mU ...并听这个: https://youtu.be/AULOC--qUOI 道歉,因为我是 Ruby 新手,并试图了解它是如何做的。
编辑: 有用资源:
http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-puts
https://softwareengineering.stackexchange.com/questions/150824/is-the-puts-function-of-ruby-a-method-of-an-object

【问题讨论】:

  • irb 打印出您键入的每个命令的返回值。有点像交互式调试器。运行脚本时,它不会输出任何内容,除非使用 puts 或类似名称告知。

标签: ruby return-value irb puts


【解决方案1】:

这里的 IRB 输出显示的是操作的返回值,不一定是执行过程中打印到 STDOUT(即终端)的返回值。

您的脚本只是丢弃了返回值,您必须这样做:

val = if true
        'is true_1'
      else
        'is false'
      end

puts val

【讨论】:

  • 啊,是的,很抱歉,您看到 puts 操作的返回值为 nil。我已经适当地编辑了我的答案。
  • @Ginty:这里不需要begin。你可以做val = if true ...
  • begin 块的目的是什么?你没有任何例外,你没有多个表达式,你需要它做什么?
  • @Mr.Kennedy:IRb 是一个 REPL - 一个读取评估打印循环。它读取您输入的内容,评估代码,打印出它的值,然后循环回到开头(即读取下一个表达式)。所以,是的,它正在打印评估表达式的结果。这通常简称为“返回值”,尽管严格来说没有方法调用,因此没有return。 (更准确地说:IRb 正在打印对作为评估表达式值的对象调用 inspect 方法的结果。)
猜你喜欢
  • 2016-04-19
  • 2015-12-13
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2014-01-02
  • 2021-11-09
相关资源
最近更新 更多