2015-11-20 39 views
-1

我試圖做有條件分配:在||中賦值爲零值測試

entries = (@instance_1 || @instance_2) 

如果@instance_1是零,我想@instance_2被分配到entries。在這種情況下,我知道其中一方會有價值。

但是,我遇到了一個問題,其中@instance_1爲零,@instance_2有一個值,但@instance_1正在分配中使用。

我接近這個不正確嗎?

這是在Rails應用程序的上下文中。我甩了出來,從撬一些數據,所以你可以看到它是如何反應:

這裏的地方撬聲明正在發生:

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>] 

所以在這種情況下,它返回零,即使第二個參數(@time_entries)有一個值。

+0

你的代碼有一個錯字:'@實例2'而不是'@ instance_2'。這會導致SyntaxError,但是,我懷疑你沒有發佈你的實際代碼。 –

+0

你確定你的假設? –

+0

@Jordan是的,不是我的實際代碼。只是一個例子。編輯。 @Dave Newton我假設你的意思是我對他們的值的假設:我用'pry'發現@ instance_1是零,@ instance_2是一個填充對象,但條目被設置爲等於零 – djt

回答

3

一說@time_entries另說@times_entries

entries = (@time_entry || @times_entries) 

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

如果將其更改爲

entries = (@time_entry || @time_entries) 

它應該工作

+0

哈丁丁丁!我想答案並不像我們大家都認爲的那樣隱藏起來 – djt

+0

@dtj我認爲完全相反;它隱藏得足夠隱蔽,人們對代碼的看法幾乎都說同樣的事情。 –

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上的1.9.3p484 14.04

與ruby 2.0.0p384相同的奇怪結果。示例skript打印

nil 
nil 
[#<TimeEntry:0x000000020fcd58>] 

而我期望第一行與第三行相同。

編輯:戴恩安德森發現了錯字。如果你從一開始就提供了一個完整的例子,有人可能會更早發現它。

+0

感謝您的回答。我已經用pry的輸出更新了我的問題,所以您可以準確瞭解每個參數輸出的內容。 – djt

+0

它不適合我,它會打印包含單個「TimeEntry」的數組。 –

+0

@Ludwig Schulze謝謝。是的,我發佈了問題 – djt

0

這適用於任意數量的元素:

def first_non_nil(*args) 
    args.find { |x| !x.nil? } 
end 

@instance_1 = "hello" 
@instance_2 = "world" 
entry = first_non_nil(@instance_1, @instance_2)   #=> "hello" 
entry = first_non_nil(nil, "world")      #=> "world" 
entry = first_non_nil(nil, false, "world")    #=> false 
entry = first_non_nil("hello", nil)      #=> "hello" 
entry = first_non_nil(nil, nil)       #=> nil 
entry = first_non_nil(nil, nil, nil, nil, nil, "hello") #=> "hello" 
+0

感謝您的回覆。我已經用pry的輸出更新了我的問題,所以你可以看到每個參數輸出的是什麼 – djt

0

什麼你所描述不能:

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

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

這是正確的撬出來的。

複製你給我們:

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 
+0

是的,我知道。不過,正如我上面所概述的那樣,它沒有按照預期的那樣對我使用的數據做出響應。 – djt

+1

您沒有給我們足夠的數據,即輸入和可用代碼來重現問題。上面的例子將其分解爲裸邏輯,它是如何工作的。而且,這意味着當你的代碼遇到那個表達式時,你認爲你的代碼中不應該是零。 –

+0

我輸出了上面每個元素的值。我需要提供比這更多的信息嗎? – djt