2011-03-10 23 views
16

紅寶石可以返回什麼嗎?Ruby可以不返回任何內容嗎?

只是爲了教育目的

例如:

myarray = [1,2,3] 
myarray << some_method 

def some_method 
    if Date.today.day > 15 
    return "Trololo" 
    else 
    return __NOTHING__ 
    end 
end 

所以,如果今天是三月11'th將myarray不增加新的項目。我不想nil - 因爲nil不是什麼:)

我明白,我可以使用if | unless語句像myarray << some_method if some_method等我想明白了,我可以回到沒有或每次在Ruby中,我返回東西(至少我可以得到的是無對象)

回答

20

基本上,你要找的是聲明。但Ruby沒有語句,只有表達式一切是一個表達式,即一切都返回一個值。

9

不,你什麼都不能返回。在紅寶石中,你總是會返回一些東西(即使它只是nil) - 沒有辦法。

+7

也就是說,'nil'應該代表的「無」的概念。 – 2011-03-11 00:03:58

2

沒有什麼不代表從我所知道的任何紅寶石:)你可以定義你自己的東西,但儘可能地拋出它。在ruby中,如果你沒有明確地返回一些東西,那麼返回最後一個評估過的表達式。

5

你不能從ruby中的方法返回「nothing」。正如你指出的那樣,你可以有條件地向你的數組添加元素。你也可以在你的數組上調用.compact來刪除所有的nil元素。

5

你不能用Ruby返回真正的Nothing。一切都是一個對象。但是你可以創造一個虛假的東西來做它。見:

Nothing = Module.new # Same as module Nothing; end 
class Array 
    alias old_op_append << 
    def <<(other) 
    if other == Nothing 
     self 
    else 
     old_op_append(other) 
    end 
    end 
end 

這是醜陋的,但在您的示例工程。 (沒有任何東西仍然是一個對象。)

+0

有趣的黑客。可以是有用的。 – fl00r 2011-03-11 11:33:18

0

您可以使用異常來模擬Nothing。

class NothingError < RuntimeError 
end 

def nothing 
    raise NothingError 
end 

def foo x 
    if x>0 then x else nothing end 
end 

def nothingness 
    begin 
    yield 
    rescue NothingError 
    end 
end 

a = [1,2,3] 
nothingness { a << foo(4) } 
nothingness { a << foo(0) } 

也許不是一個好主意但是......

+0

你可以使用'a << foo(4)rescue NothingError'來代替虛無... – 2014-02-05 17:14:09

相關問題