零值在||中分配测试

时间:2015-11-20 20:20:07

标签: ruby

我正在尝试进行条件分配:

entries = (@instance_1 || @instance_2)

如果@instance_1为零,我希望将@instance_2分配给entries。在这种情况下,我知道其中一个会有一个值。

但是,我遇到@instance_1为零的问题,而@instance_2有一个值,但@instance_1正在分配中使用。

我接近这个错误吗?

这是在Rails应用程序的上下文中。我从Pry中删除了一些数据,所以你可以看到它是如何反应的:

以下是Pry声明发生的地方:

entries = (@time_entry || @times_entries)
binding.pry

现在,entries

的值
[1] pry(#<TimelogController>)> entries
=> nil

@time_entry的价值:

[2] pry(#<TimelogController>)> @time_entry
=> nil

@time_entries的价值:

[3] pry(#<TimelogController>)> @time_entries
=> [#<TimeEntry:0x00000006f6f878
  id: 1838,
  project_id: 10,
  user_id: 8,
  issue_id: 1481,
  hours: 1.0,
  comments: "hey now",
  activity_id: 9,
  spent_on: Fri, 20 Nov 2015,
  tyear: 2015,
  tmonth: 11,
  tweek: 47,
  created_on: Fri, 20 Nov 2015 20:07:06 UTC +00:00,
  updated_on: Fri, 20 Nov 2015 20:07:06 UTC +00:00,
  freshbooks_time_entry: nil>]

所以在这种情况下,它返回nil,即使第二个参数(@time_entries)有一个值。

4 个答案:

答案 0 :(得分:3)

一个说@time_entries,另一个说@times_entries

entries = (@time_entry || @times_entries)

VS

[3] pry(#<TimelogController>)> @time_entries

如果您将其更改为

entries = (@time_entry || @time_entries)

它应该有用

答案 1 :(得分:1)

irb会议记录:

irb(main):001:0> @i1 = nil
=> nil
irb(main):002:0> @i2 = 3
=> 3
irb(main):003:0> a = (@i1 || @i2)
=> 3
irb(main):004:0> a = @i1 || @i2
=> 3

您描述的问题无法再现

编辑: 我看到你的编辑了。所以,让我帮你提供一个完整的例子:

class TimeEntry
end
@time_entry = nil
@time_entries = [TimeEntry.new]
entries = (@time_entry || @times_entries)
p entries
p @time_entry
p @time_entries

是的,这会输入nil作为条目的值。现在我可以重现,但还没有解释。相反,我对此感到困惑。我用来执行这个例子的ruby版本是ubuntu 14.04上的1.9.3p484

与ruby 2.0.0p384相同的奇怪结果。示例skript打印

nil
nil
[#<TimeEntry:0x000000020fcd58>]

然而,我希望第一行与第三行相同。

编辑:Dane Anderson发现了这个错字。如果你从一开始就提供了一个完整的例子,有人可能会早些发现它。

答案 2 :(得分:0)

这适用于任意数量的元素:

With ws.Shapes(myImg.ID)

    PicHeight = .Height
    PicWidth = .Width

End With

答案 3 :(得分:0)

您所描述的内容不可能是:

(true || nil)  # => true
(nil  || true) # => true

(true  || false) # => true
(false || true)  # => true

那是出于Pry。

复制你给我们的内容:

require 'date'

class TimeEntry
  def initialize
    @id                    = 1838
    @project_id            = 10
    @user_id               = 8
    @issue_id              = 1481
    @hours                 = 1.0
    @comments              = "hey now"
    @activity_id           = 9
    @spent_on              = Date.parse('Fri, 20 Nov 2015')
    @tyear                 = 2015
    @tmonth                = 11
    @tweek                 = 47
    @created_on            = DateTime.parse('Fri, 20 Nov 2015 20:07:06 UTC +00:00')
    @updated_on            = DateTime.parse('Fri, 20 Nov 2015 20:07:06 UTC +00:00')
    @freshbooks_time_entry = nil
  end
end

@time_entry = nil
@time_entries = [TimeEntry.new]
entries = (@time_entry || @time_entries) # => [#<TimeEntry:0x007f853991dfc8 @id=1838, @project_id=10, @user_id=8, @issue_id=1481, @hours=1.0, @comments="hey now", @activity_id=9, @spent_on=#<Date: 2015-11-20 ((2457347j,0s,0n),+0s,2299161j)>, @tyear=2015, @tmonth=11, @tweek=47, @created_on=#<DateTime: 2015-11-20T20:07:06+00:00 ((2457347j,72426s,0n),+0s,2299161j)>, @updated_on=#<DateTime: 2015-11-20T20:07:06+00:00 ((2457347j,72426s,0n),+0s,2299161j)>, @freshbooks_time_entry=nil>] # !> assigned but unused variable - entries