在颜色下不确定第二个问号是什么意思。
这称为条件运算符。 (例如,参见the ISO Ruby Language Specification 的第 11.5.2.2.5 节 条件运算符表达式。)
condition ? consequence_truthy : consequence_falsy
将评估condition,并根据结果是真还是假,将评估第一个或第二个结果。
就我个人而言,我发现条件运算符在 Ruby 中毫无用处。在 C 和类似语言中,条件运算符是必需的,因为它是一个表达式,而条件语句是一个语句。所以,如果需要在表达式中使用条件,就不能使用条件语句,必须使用条件运算符。
然而,这不适用于 Ruby:在 Ruby 中,一切都已经是一个表达式,没有语句。条件表达式(例如,参见第 11.5.2.2.2 节 if 表达式、第 11.5.2.2.3 节 unless 表达式和第 11.5 节.2.2.4 case 表达式) 已经可以作为表达式使用,所以不需要使用条件运算符。
就个人而言,我发现条件表达式比条件运算符更具可读性:
if condition then consequence_truthy else consequence_falsy end
这在语义上等同于条件运算符,唯一的区别是语法:它具有不同的优先级,但实际上比条件运算符的优先级更自然。
所以,在我看来,你的例子可以写得更清楚
def initialize(value)
@value = value
@given = if value == 0 then false else true end
end
def color
if given? then :blue else :red end
end
实际上,initialize 包含一个无用的使用条件,因为Integer#== 已经 返回一个布尔值。因此,以下内容会更加清晰:
def initialize(value)
@value = value
@given = value != 0
end