Ruby等价于JavaScript操作符`||`

Ruby等价于JavaScript操作符`||`,ruby,date,Ruby,Date,如何在Ruby中实现这一点?可以在不重复变量的情况下完成吗? Javascript: b = a || 7 如果a不是0则分配a,否则分配7 一种特殊情况是,如果date.wday返回0(星期日),则将其转换为7。您可以使用三元运算符: date.wday == 0 ? 7 : date.wday 对于0和7的特殊情况: a = (b + 6) % 7 + 1 :)Ruby中只有两个falsy值:nil和false。所以,如果你真的想要这种方法 a = b == 0 ? 7 : b 是

如何在Ruby中实现这一点?可以在不重复变量的情况下完成吗? Javascript:

b = a || 7
如果
a
不是
0
则分配
a
,否则分配
7


一种特殊情况是,如果date.wday返回0(星期日),则将其转换为7。

您可以使用三元运算符:

 date.wday == 0 ? 7 : date.wday

对于
0
7
的特殊情况:

a = (b + 6) % 7 + 1

:)

Ruby中只有两个falsy值:
nil
false
。所以,如果你真的想要这种方法

a = b == 0 ? 7 : b
是一个合理的解决方案,因为
0
不能评估为
false

然而,更好的选择是,而不是。然后,您就不需要再进行这种比较了,因为它会根据需要为周一返回
1
,为周二返回
2
,最后为周日返回
7

date = Date.new(2016,19,6) # => Jun 19 2016, Sunday
date.cwday # => 7
只是出于好奇:

class Object
  def javascript_or?(other)
    (is_a?(FalseClass) || nil? || '' == self || 0 == self) ? nil : self
  end
end
以及:


您在这里描述的不是一个逻辑问题,而是一个映射问题:

WEEKDAY_MAP = Hash.new { |h,k| h[k] = k < 7 ? k : nil }.merge(0 => 7)   


如果您想在某个时候进一步修改逻辑,这也是可能的。

我不确定,但可能是
[date.wday,7]。检测{I!=0}
,因为逻辑上不可能得到您想要的。在使用该值之前,您必须至少执行一次比较。关于您的:只需使用
cwday
(而不是
wday
)–如果日期是周日,则返回
7
(而不是
0
);-)等待你必须使用像
wday
这样的日期方法吗?我必须先转换为datetime,但
cwday
解决了我的问题。我可以自己找出更好的版本吗?我将问题编辑为Ruby,而不是RailRuby。Ruby不会将0视为nil/false。这是你必须习惯的事情之一。更好的方法是将自定义方法添加到Date类中。您可以在这里找到一个示例:0求值为true只是语言的一部分。这是故意的。例如,请参见:。如果您想要一个异常,您应该做一些事情,比如构建一个提供异常的实用程序类。我个人不会忽略日期,至少在你们合作的情况下不会。这只会让分享你的代码的人感到困惑。@Aurimas:我不知道你是否能自己弄清楚三元运算符,因为你无法弄清楚Ruby中的0不是nil/false,这应该是运算符-| |用法的情况。虽然我会使用
cwday
,但我认为这是第二个。我不知道为什么它被否决了,除非是OP觉得它有侮辱性。:)太好了!简直易读@这是因为你在这里已经有了5位数的声誉,Cary(;我只是照亮了最重要的部分。坦率地说,我有3位数(还有一个小数点),但我也不需要粗体。为了熵恒定性,我把它投了更高的票,多给了10个代表:)读者:mudsie已经停药了。是的。该去拿我的药片了,谢谢@CarySwoveland的提醒!明天见。Rubyist will to power也可以
case self
,这可能比这一系列
|
操作符更快。@tadman是的,我考虑过(尽管我怀疑它可能更快),但我故意让这个答案尽可能神秘。很好,但是它看起来不是比第七天更复杂一点吗D@Aurimas; 这实际上是一个很好的解决方案,因为在初始化之后(仅一次),您将不需要使用任何逻辑操作来确定您的值。@Aurimas因为Ruby在逻辑意义上对什么是错误非常严格,
|| 7
永远不会发生,所以你最好放弃这个想法:在罗马的时间原则适用于这里。如果您正在执行映射操作,请将其表示为映射操作。在其他语言中,你可以利用零是一个假值,因此你的愿望的最简单表达会因约束条件的不同而有很大差异。事实上,这是最好的答案,因此它缩小了这是一个映射问题的范围。
WEEKDAY_MAP = Hash.new { |h,k| h[k] = k < 7 ? k : nil }.merge(0 => 7)   
b = WEEKDAY_MAP[a]