我刚看到这段代码:
method_name(ARGV.shift || "somefile.txt")
基本上应首先评估ARGV[0]
,如果它不存在则从“somefile.txt”读取。
我的问题是,&&
运算符是否也可以在这里使用,以及在什么情况下使用?
此外,这个“将此或此参数传递给Ruby中的方法”的概念是否有名称?
答案 0 :(得分:2)
如果使用&&
,那么当没有nil
时,参数将是ARGV[0]
,而当"somefile.txt"
时,参数将是ARGV[0]
。请注意,ARGV
的元素(如果有)将是字符串,因此当传递元素时,ARGV[0]
不可能是nil
或false
。
通常,||
和&&
分别称为“(短路)分离”和“(短路)连接”。
||
的典型用例是提供默认值:
foo = potentially_falesy_value || default
&&
的典型用例是提供一个取决于另一个值的真实性的值:
foo = hash[:bar] && hash[:bar][:baz]
答案 1 :(得分:2)
简短的回答,logical operators
将根据truthy
or falsey
返回操作数之一。在实践中,除了 true
或false
之外,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)
分配非布尔变量时,它的可读性不高(恕我直言),但它有效。