0

I just saw this code:

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

which basically should first evalute ARGV[0] and if it doesn't exist then read from "somefile.txt".

My question was, can the && operator be also used here, and in what situations?

Also, does this concept of "passing this or this argument" to a method in Ruby have a name?

4

5 回答 5

2

简短的回答是,将根据是否为​​orlogical operators返回其操作数之一。在实践中,几乎 Ruby 中的所有内容都将评估为except或。truthyfalseytrue falsenil

例子:

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

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

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

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

应该注意的是,这可能不是一种被广泛接受的做法。(看评论)

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

于 2013-11-10T06:55:00.087 回答
2

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

一般||分别&&称为“(短路)析取”和“(短路)合取”。

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

foo = potentially_falesy_value || default

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

foo = hash[:bar] && hash[:bar][:baz]
于 2013-11-09T16:35:37.013 回答
0

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

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

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

于 2013-11-09T17:10:59.413 回答
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

&& 运算符也可以用在这里吗

当然可以,但可以说它的实用价值较低。在这种情况下使用 an 可能更清楚if

puts foo && bar

# is the same as:
if foo
  puts bar
end

# or:
puts bar if foo

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

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

于 2013-11-09T16:40:16.637 回答
0

||用于提供默认值。||返回第一个“真”值。“真”值——在 ruby​​ 中被解释为真布尔值的值。所以链中的第一个“真”值将作为表达式的结果。&&返回第一个“假”值。完全类比。但它没有如此优雅的应用。

于 2013-11-09T16:41:46.513 回答