使用||在Ruby中的参数?

时间:2013-11-09 16:29:48

标签: ruby

我刚看到这段代码:

method_name(ARGV.shift || "somefile.txt") 

基本上应首先评估ARGV[0],如果它不存在则从“somefile.txt”读取。

我的问题是,&&运算符是否也可以在这里使用,以及在什么情况下使用?

此外,这个“将此或此参数传递给Ruby中的方法”的概念是否有名称?

5 个答案:

答案 0 :(得分:2)

如果使用&&,那么当没有nil时,参数将是ARGV[0],而当"somefile.txt"时,参数将是ARGV[0]。请注意,ARGV的元素(如果有)将是字符串,因此当传递元素时,ARGV[0]不可能是nilfalse

通常,||&&分别称为“(短路)分离”和“(短路)连接”。

||的典型用例是提供默认值:

foo = potentially_falesy_value || default

&&的典型用例是提供一个取决于另一个值的真实性的值:

foo = hash[:bar] && hash[:bar][:baz]

答案 1 :(得分:2)

简短的回答,logical operators将根据truthy or falsey返回操作数之一。在实践中,除了 truefalse之外,Ruby中的几乎所有内容都将评估为nil

示例:

expr1 || expr2将返回(expr1 ,如果不是 falsey )或(expr2
换句话说,第一个 truthy 值或最终操作数,

expr1 && expr2将返回(expr1 ,如果 falsey )或(expr2)。
换句话说,第一个 falsey 值或最终操作数。

对于实际用例,类似的例子是:
使用&&运算符检查ARGV中的标志,然后传递文件名。

method_name(ARGV.include?('-w') && "write_file.txt")

应该指出的是,这可能不是一种被广泛接受的做法。 (见评论)

但是,以这种方式使用||更喜欢用户提供的值超过默认值。

答案 2 :(得分:0)

  

首先评估ARGV [0]并且如果它不存在则从“somefile.txt”读取。我的问题

你是对的。如果ARGV.shift || "somefile.txt"表达式返回某些非虚假值,则ARGV.shift表达式将评估为"somefile.txt",否则为puts nil || "foo" # => "foo" puts "foo" || "bar" # => "foo" puts "foo" || nil # => "foo" puts "foo" || raise # => "foo" # and doesn't blow up, because the 'raise' # is never evaluated 。其他一些例子:

if
  

可以和&&运算符也可以在这里使用

当然,但可以说实用价值较低。在这种情况下使用puts foo && bar # is the same as: if foo puts bar end # or: puts bar if foo 可能更清楚:

{{1}}
  

这个“将此参数或此参数传递给Ruby中的方法”的概念是否有名称?

我不确定它是否有任何'官方'名称,但我通常认为这种模式被称为'默认值'或'后备价值'。

答案 3 :(得分:0)

||用于提供默认值。 ||返回第一个“true”值。 “True”值 - 在ruby中被解释为true布尔值的值。因此,链中的第一个“真实”值将是表达式的结果。 &&返回第一个“false”值。完全类比。但它没有这么优雅的应用。

答案 4 :(得分:0)

除了明显的布尔运算符功能外,&&可以像在JavaScript等语言中一样使用:

a = cond1 && cond2 && value     # a is now value if cond1 and cond2,
                                # else nil or false (depends on cond1 and cond2)

分配非布尔变量时,它的可读性不高(恕我直言),但它有效。