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:cif(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 &lt; '12:00' then 'AM' else 'PM' end。一般来说,不像其他语言,if 是一个语句,条件运算符是一个表达式,在 Ruby 中很少需要使用条件运算符,因为if 也是一个表达式(实际上,没有Ruby 中的语句)。真的,唯一的区别是简洁(这并不是一件普遍的好事)和优先级,条件运算符的优先级已经绊倒了很多程序员,正如 SO 上关于它的问题所证明的那样。 注意:这不是对您的回答的批评。 @JörgWMittag 非常正确。 :) 我只是想为不熟悉三元运算的人澄清一下。也许您的示例可以作为 if...then...else...end 的简写示例进行编辑。 随意偷窃 ;-) 哦,谢谢你的回复,它提醒我我忘了投票。

以上是关于Ruby - 解密使用:[重复]的主要内容,如果未能解决你的问题,请参考以下文章

与 PHP 一起使用的最佳密码加密和解密技术 [重复]

使用 Ruby 的活跃商人 [重复]

使用 JavaScript BigQuery UDF 解密/解码 AES256 [重复]

使用stings列表进行python加密和解密[重复]

如何使用正则表达式匹配 Ruby 中包含特殊字符的重复模式?

Ruby:比较级之间有啥区别:“||”和“或” [重复]