为什么我不能在红宝石中做"如果为零"?

Mat*_*iby 10 ruby

>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil
Run Code Online (Sandbox Code Playgroud)

为什么打印测试?

Nak*_*lon 16

在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"
Run Code Online (Sandbox Code Playgroud)

  • @swanand:`zero?`和`empty?`在核心库中(不知道你考虑过哪些类). (2认同)

Ton*_*roy 6

您可以将Ruby视为测试布尔值或数据可用性(vs nil).C和C语言支持的从0到false的隐式转换(因此像C++这样的其他语言)在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
Run Code Online (Sandbox Code Playgroud)