Ruby中变量之前的感叹号

时间:2015-01-11 00:05:26

标签: ruby arrays multidimensional-array

经历红宝石和尚,偶尔他们会用不熟悉的语法从左侧字段中抛出代码:

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

有人可以解释这三种用途吗? 1)对象之前的感叹号 2)附加问号3)lambda中的冒号用法

3 个答案:

答案 0 :(得分:2)

!只是一个非运营商。

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

!b.nil? ? a + b : a是一个三元操作就是行动。它的工作原理如下:

if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this 

相当于说

if a then b else c end

如果!b.nil? truea+b,那么与上述陈述相关的是a,那么它是{{1}}。

了解更多here

答案 1 :(得分:1)

1) !,否定 - 它将除nilfalse之外的所有对象更改为false(将其他对象更改为true) 2)name?应返回false(falsenil)或true值(其他所有内容)。在大多数情况下,它将是truefalse个对象 最后带有?的方法表明它们是谓词。在您的示例中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引发了错误。

答案 2 :(得分:0)

  1. 对象前的感叹号:

    !x表示否定x,如果x为真,那么!x表示错误,反之亦然

  2. 附加问号:

    x? y:z

    表示如果x为真,则返回y,否则返回z

  3. lambda中的冒号用法

    我在上面的2.

  4. 中解释过