【问题标题】:Why can't I do "if zero" in ruby?为什么我不能在红宝石中做“如果为零”?
【发布时间】:2010-09-24 03:33:49
【问题描述】:
>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil

为什么要打印测试?

【问题讨论】:

  • 您的问题似乎已得到解答。但是您应该停止使用数值来表示真/假。如果您的语言支持,请使用关键字 true 和 false
  • Rails 扩展了整数类型。你也可以使用“if current_user.first_visit.zero?”
  • @vise: .zero? 是普通的老红宝石:APIdock.com link

标签: ruby


【解决方案1】:

在 Ruby 中,只有 nil 可以被视为类似于 false。没有假设0""[]表示false,所以你必须使用== 0.blank?.empty?.zero?等。

nil 并不总是表现得像false。例如,在字符串插值中,.to_s 方法应用于 #{} 内容,对于 FalseClassNilClass 的工作方式不同:

irb(main)> "qwe #{false} rty"
=> "qwe false rty"
irb(main)> "qwe #{nil} rty"
=> "qwe  rty"

【讨论】:

  • 请注意 .blank? , .empty? 是 Rails 框架(通过 activesupport)提供的扩展,在 Ruby Standard 或 Core Lib 中不可用。不同的行为也是因为“#{false}”调用了to_s方法。
  • @swanand: zero?empty? 存在于核心库中(但不确定您想到了哪些类)。
  • @pdom 的编辑是正确的。 IDK,为什么其他人拒绝它。 stackoverflow.com/review/suggested-edits/7845176
【解决方案2】:

您可以将 Ruby 的 if 视为测试布尔值或数据的可用性(相对于nil)。 C 和(因此其他语言,如 C++)支持从 0 到 false 的隐式转换更像是 C 具有独特布尔类型之前的历史产物。在那里,它依赖于 0 作为一个方便的标记值或具有直观的含义。对于很多事情(例如,某些国家的衣服尺码范围从 0 到 8,POSIX libC 函数调用结果),零并不能很好地转换为逻辑上等效的布尔值,所以 Ruby 走自己的路并不是一件坏事。

从这个角度来看,您的代码的问题在于 current_user.first_visit(其名称暗示布尔类型)实际上为 0 而不是 false。或者,如果您有明确的数字 current_user.visit_counter,那么使用以下之一是自然而正确的:

current_user.visit_counter > 0
current_user.visit_counter >= 1
current_user.visit_counter != 0

【讨论】:

  • 我想说这很不方便,尤其是当你来自其他语言时,0 几乎总是被视为假值,只是让 ruby​​ 更难使用
【解决方案3】:

你可以试试这个

>> current_user.first_visit
=> 0
>> if current_user.first_visit != 0
>> puts "test"
>> else
>> puts "fail"
>> end
fail
=>nil

在检查数值时,您还需要将其与预期值匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2023-03-28
    • 2015-07-28
    • 2015-09-28
    • 2012-09-03
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多