2011-09-28 52 views
1

如何在Ruby中的方法之間傳遞變量?

新手紅寶石問題。

我有一個類

class ReportPage < Page 

def badge_item(item_int) 
    case item_int 
    when 1..50 then @item= 1 
    when 50..100 then @item= 50 
end 

def check_completed_items_badge 
    badge_item(50) 
    puts @item 
end 
end 

果然,它把零。我的問題出現了 - 如何在類的另一種方法中使用@item變量?

非常感謝!

+1

適合我。你打電話過得怎麼樣? –

回答

3

的問題是不是與變量賦值,而是與你的情況下使用/時的語法。當你給出一個參數時,它會使用精確匹配來比較不同的場景。你的情況更好的辦法很可能會使用這樣的事情,而不是:

def badge_item(item_int) 
    case 
    when (1..50).include?(item_int) then @item = 1 
    when (50..100).include?(item_int) then @item = 50 
    end 
end 

編輯

從Tumtu更正:

情況下使用===方法來比較值。即:(1..50)=== 50

+0

作品!感謝你一個不錯的技術。 – Yulia

+3

'當你提供一個參數時,它使用精確的匹配來比較不同的場景'這個說法是錯誤的。 'case'使用'==='方法來比較值。即:(1..50)=== 50 – BitOfUniverse

+0

奧基,不知道。感謝信息 – DanneManne

5

事情是你錯過end關鍵字爲您的case。這個程序還有另一個問題。 when(1..50)包含1到50之間的所有情況,並且when(50..100)涵蓋50到100,這會導致混淆原因badge_item(50)將進入第一行,設置@item1並退出case ... end塊。所以最後它會在屏幕上打印1

爲了讓你的意圖更加清晰,你應該使用

def badge_item(item_int) 
    @item = case item_int 
    when 1..49 then 1 #two dots, cover 1 to 49 
    when 50..100 then 50 
    end 
end 

OR

def badge_item(item_int) 
    @item = case 
    when 1...50 then 1 #three dots between, cover 1 to 49 
    when 50..100 then 50 
    end 
end 
+0

不知道這一點。實際上,這就是爲什麼我的劇本失敗的原因。謝謝! – Yulia

0

正確的方法,你的情況是使用OOP:

class ReportPage < Page 
    class BadgeItem 
    def initialize(int) 
     fail "Badge item integer should be in the range 0..99!" unless 0..99 === int 
     @int = int 
    end 
    def classify 
     case @int 
     when 0...50 then 1 
     when 50..99 then 50 
     end 
    end 
    end 

    def check_completed_items_badge 
    badge_item = BadgeItem.new 50 
    puts badge_item.classify 
    end 
end 
0

我知道一個答案已經被接受,但我想提出一個更一般的答案,關於如何實例變量的問題在周圍散步。

直接從紅寶石琅你會得到如下:

的Ruby不需要變量聲明。它使用簡單的命名約定 來表示變量的範圍。

  • 變種可能是一個局部變量。
  • @var是一個實例變量。
  • $ var是一個全局變量。

這些簽名通過允許程序員很容易地識別每個變量的角色來提高可讀性。這也變得沒有必要 使用一個厭煩的自我。前置於每個實例成員

理解這些不同類型的變量之間的區別很重要。爲了做到這一點,我掀起了一個小例子,該例子應該有助於讓任何在這裏導航的人都瞭解這些行爲的良好起點。

class Scoping 
    @unreachable = "but found it. trololol" 
    $instance = "and found it. swag swag" 
    def initialize(int) 
    trial = @unreachable ? @unreachable : " but failed to find." 
    puts "reaching for the unreachable . . ." + trial 
    @int = int 
    end 
end 

puts $instance 
Scoping.new 10 
trial = @int ? @int : " but failed to find." 
puts "Reaching for instance from class . . ." + trial 
trial = $instance ? $instance : " but failed to find." 
puts "Reaching for global variable . . ." + trial