2014-03-26 75 views
1

Ruby是一種令人敬畏的語言,有時讓我感到困惑(因爲我不是那麼棒)。而splat參數是造成一些混淆的原因。請賜教。圖示參數之後如何添加參數的方法調用?

考慮下面的方法:

def doSomething(with_this, *and_that) 
    # ... 
end 

您可以調用該方法與選項1

doSomething("With this", "index 0", "index 1", "etc") 

或用選項2

an_array = ["index 0", "index 1", "etc"] 
doSomething("With this", *an_array) 

但是,如果我的方法,像這樣定義:

def doSomething(with_this, *and_that, and_even_that) 
    # ... 
end 

注意這裏是圖示參數後的參數

問題1:有沒有一種方法可添加參數爲and_even_that除了使用以下方法?

an_array = ["index 0", "index 1", "etc"] 
doSomething("With this", *an_array, "With that") 

在追求成爲一個出色的Ruby的程序員,我也想知道這些:

額外的問題

是它不使用一個以上的圖示的最佳實踐方法定義中的參數?

是否最好的做法是在方法定義中爲最後留下splat參數?

預先感謝您。

回答

2

你感到困惑的方法使用圖示聲明,並使用圖示方法調用

它們彼此獨立的:

def regular_method(arg1, arg2, arg3) 
    #do something 
end 

def method_with_splat(arg1, *more_args) 
    # do something 
end 

arr = [1, 2, 3] 

regular_method(*arr) # works! 

method_with_splat(4, *arr) # works! (arg1==4, more_args==[1,2,3]) 

method_with_splat(4, 5, *arr) # also ok! (arg1==4, more_args==[5,1,2,3]) 

method_with_splat(*arr, 4, 5, 6) # just fine! (arg1==1, more_args==[2,3,4,5,6]) 

所以,本着同樣的精神:

def splat_in_the_middle(arg1, *more_args, last_arg) 
    # do something 
end 

splat_in_the_middle(*arr, 4, 5, 6) # arg1==1, more_args==[2,3,4,5], last_arg==6 

和擴大是:

def splat_in_the_middle(arg1, *more_args, arg2, last_arg) 
    # do something 
end 

splat_in_the_middle(*arr, 4, 5, 6) # arg1==1, more_args==[2,3,4], arg2==5, last_arg==6 

通知的第一個參數被分配到第一個參數,最後的參數總是分配給最後一個參數,另一個變成元素more_args數組。

至於你額外的問題:

  1. 無法在一個單一的方法定義聲明多個圖示。原因很簡單,從上面的例子明顯 - 有沒有辦法爲參數解析器知道其中一個圖示結束,當其他開始:

    def two_splats(arg1, *splat1, arg2, *splat2) 
        # do something! 
    end 
    # => syntax error! 
    
    two_splats(1, 2, 3, 4, 5, 6) # arg1==1, splat1==[????] arg2==?, splat2==[????] 
    

    雖然有調用的方法更沒有問題不止一個圖示:

    method_with_splat(*arr, *arr) # arg1==1, more_args=[2,3,1,2,3] 
    
  2. 如果有很好的理由,以具有在中間的圖示和參數是可讀的,容易理解,沒有理由把圖示在中間。一個非常有用的用例,例如可能是最後一個參數是一個選項哈希:

    def splat_in_the_middle(first_arg, *one_or_more_other_args, options) 
    
+0

只是爲了確保我得到了它,在'splat_in_the_middle(*改編,4,5,6) #arg1 == 1,more_args == [2,3,4,5],last_arg == 6' **參數的x個參數** **圖示將與**最後一個** x數字「匹配」來自函數調用的參數? – sargas

+0

完全正確 –

+0

我編輯了我以前的評論。 – sargas