Ruby 中变量前的感叹号

Exclamation points before a variable in Ruby

通过 ruby 僧侣,他们偶尔会从左侧字段中抛出一个语法不熟悉的代码:

 def compute(xyz)
   return nil unless xyz
   xyz.map {|a,b| !b.nil? ? a + b : a}
 end

谁能解释一下这三种用途? 1)宾语前感叹 2) 额外的问号 3) lambda

中冒号的使用
  1. 宾语前感叹号:

    !x 表示 x 的否定,如果 x 为真,则 !x 表示假,反之亦然

  2. 追加问号:

    x ? y : z

    表示如果x为真,则returny,否则returnz

  3. lambda 中的冒号用法

    我在上面2中解释过

! 只是一个非运算符。

b.nil? 是一种检查 b 的值是否为 nil 的方法。 Returns 一个布尔值。

!b.nil? ? a + b : a是三元运算是action。它是这样工作的:

if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this 

相当于说

if a then b else c end

如果!b.nil?true,那么与上面的陈述相关,答案是a+b,否则是a

阅读更多here

1) !, negations - 它将除 nilfalse 之外的每个对象都更改为 false(其他对象变为 true) 2) name? 应该 return false(falsenil) 或 true 值(其他一切)。在大多数情况下,它将是 truefalse 个对象。
with ? 结尾的方法表明它们是谓词。在您的示例中 nil? 检查对象是否为零。在其他语言中,您可能会发现类似这样的内容:is_nil.
其他示例:

[].empty? # true 
3.zero? # false
0.zero? # true

3) 您示例中的冒号是 a ternary if 的一部分。

'cond' ? 'true value' : 'false value'

类似于:

if 'cond'
'true value'
else
'false value'
end

?:if else 之间的一个区别是优先级:

def foo a
a # just return a
end
foo 2 ? 3 : 4
# => 3
foo if 2 then 3 else 4 end
# error

在最后一个示例中 Ruby 想要 运行 function1 if condition 但它找到了 function if condition #some garbage,因此 Ruby 引发了错误。