Ruby - 解密使用:[重复]
Posted
技术标签:
【中文标题】Ruby - 解密使用:[重复]【英文标题】:Ruby - deciphering use of : [duplicate] 【发布时间】:2015-07-12 19:34:58 【问题描述】:我一直在 Ruby Monk 进行练习,但我无法理解其中一个示例解决方案。
问题 (from this page) 是:
编写一个计算数组元素个数的方法 被传入,仅当数字 42 中的索引 数组的一维表示为 5。
我的解决方案,效果很好,是:
def zen(array)
converted_array = array.flatten.compact
converted_array.count if converted_array.index(42) == 5
end
他们的解决方案是:
def zen(array)
converted = array.compact.flatten
converted.index(42) == 5 ? converted.count : nil
end
我了解方法第二行中:
左侧的所有内容,但之后我无法弄清楚。我以为compact
会从数组中删除所有 nil 值?
【问题讨论】:
:
与 ?
一起使用,它是单个运算符。这是一个快捷方式:a?b:c
是 if(a) then b else c
。
***.com/questions/4252936/…
@Mat,非常感谢您澄清这一点。如果您在答案中提供了答案,我将很乐意接受。
【参考方案1】:
?...:
被称为三元运算符。假设我们想根据当前时间设置一个变量x
等于 AM 或 PM。用简单的语言我们可以说:
x='AM' if time < '12:00' but x='PM' if time > '12:00'
但很明显,这不是有效的 Ruby(或其他任何事情!)我们可以用三元运算符做同样的事情,简化原本会变成两个条件的东西:
x = time < '12:00' ? 'AM' : 'PM'
知道这就是它的工作原理,我们现在可以理解您的 zen 函数的最后一行。意识到这是最后一行非常重要...
converted.index(42) == 5 ? converted.count : nil
您是正确的,compact 将删除 nil,但这并不是要查看结果数组中是否有 nil。相反,这是检查该数组中的元素 42 是否为 5。如果是,则整个函数返回 converted.count
。如果不等于 5,则整个函数返回nil
。
为什么?因为 Ruby 中函数最后一行的评估值作为它的返回值返回。如果你仔细想想,return
语句也是如此,因为它的求值是你放在它右边的任何东西!
【讨论】:
非常感谢您的解释。超级有用! 你的例子完全等同于x = if time < '12:00' then 'AM' else 'PM' end
。一般来说,不像其他语言,if
是一个语句,条件运算符是一个表达式,在 Ruby 中很少需要使用条件运算符,因为if
也是一个表达式(实际上,没有Ruby 中的语句)。真的,唯一的区别是简洁(这并不是一件普遍的好事)和优先级,条件运算符的优先级已经绊倒了很多程序员,正如 SO 上关于它的问题所证明的那样。
注意:这不是对您的回答的批评。
@JörgWMittag 非常正确。 :) 我只是想为不熟悉三元运算的人澄清一下。也许您的示例可以作为 if...then...else...end 的简写示例进行编辑。
随意偷窃 ;-) 哦,谢谢你的回复,它提醒我我忘了投票。以上是关于Ruby - 解密使用:[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 JavaScript BigQuery UDF 解密/解码 AES256 [重复]