2014-04-17 54 views
2

在此示例中,方法定義中的最後一個english對我來說似乎沒有必要。我拿出來了,代碼工作得很好。爲什麼這本書包含它?是否有某種我不知道的約定?方法定義中的額外表達式

class Integer 
    def to_eng 
    if self == 5 
     english = 'five' 
    else 
     english = 'fifty-eight' 
    end 
    english 
    end 
end 

# I'd better test on a couple of numbers... 
puts 5.to_eng 
puts 58.to_eng 
+0

它在計算上是等同的,但更清楚地表達了你對人的意義。相關的,它也保護你的情況下,上面的代碼改變。 –

+1

不僅如此 - 變量的存在是毫無意義的。你可以用'if self == 5'和'five'else'five-eight'end'替換方法體。 – Chuck

+1

@Darshan,我恭敬地不同意。所有這些不必要的代碼行和不必要的局部變量都是混亂的。 Imo,讀者可以解析'self == 5? '五':'五十八'(正如@Donatas所建議的)速度要快很多,而且誤讀的可能性也會降低。至於在最後重複該變量以防止對代碼進行更改,它可能會產生相反的效果。 –

回答

0

它確保返回局部變量'english'中的值。方法中最後一次執行的語句是返回的。

在這種情況下,這是沒有必要的,但如果(例如)的方法改寫爲...

def to_eng 
    english = 'fifty-eight' 
    english = 'five' if self == 5 
end 

...你會發現事情並沒有得到返回的任何數量的5以外,因爲最後一個語句...沒有被執行...只會返回零。

2

在ruby中,最後一條語句的結果總是從函數返回。在這種情況下,結果是'english'變量的值。但是,如果我們刪除方法的最後一行,它仍然表現相同,因爲兩行都返回在'english'變量上設置的值。

english = 'five' #=> 'five' 
english = 'fifty-eight' #=> 'fifty-eight' 

此外,這種方法可以使用三元運算符以更緊湊和優雅的方式編寫。

class Integer 
    def to_eng 
    self == 5 ? 'five' : 'fifty-eight' 
    end 
end 
2

對我來說最好的理由是可調試性。在展示的代碼,你可以返回前插入調試語句,並知道結果:

class Integer 

    def to_eng 
    if self == 5 
     english = 'five' 
    else 
     english = 'fifty-eight' 
    end 

    debugger 
    # or: puts "ENGLISH IS #{english}" 
    # or: binding.pry 
    # or whatever else you want 

    english 
    end 

end 

你不能這樣做,如果你離開了最後english,因爲返回值將改變。