经历红宝石和尚,偶尔他们会用不熟悉的语法从左侧字段中抛出代码:
def compute(xyz)
return nil unless xyz
xyz.map {|a,b| !b.nil? ? a + b : a}
end
有人可以解释这三种用途吗? 1)对象之前的感叹号 2)附加问号3)lambda中的冒号用法
答案 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?
true
为a+b
,那么与上述陈述相关的是a
,那么它是{{1}}。
了解更多here
答案 1 :(得分:1)
1)
!
,否定 - 它将除nil
和false
之外的所有对象更改为false(将其他对象更改为true
)
2)name?
应返回false(false
和nil
)或true值(其他所有内容)。在大多数情况下,它将是true
或false
个对象
最后带有?
的方法表明它们是谓词。在您的示例中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)
对象前的感叹号:
!x表示否定x,如果x为真,那么!x表示错误,反之亦然
附加问号:
x? y:z
表示如果x为真,则返回y,否则返回z
lambda中的冒号用法
我在上面的2.