2015-01-15 103 views
0

我正在試圖找到從我的實例化類傳遞給模塊方法的參數數量。Ruby:檢查從實例化類傳遞給模塊方法的參數數量

class A 
    inclue ModuleA 
end 

A.new.moduleA_method(arg1, arg2, arg3) 

這是模塊A

moduleA 
    def moduleA_method(arg1, arg2, arg3) 
    puts ARGV.size 
    end 
end 

ARGV.size打印0的內容,但它應該是3按照我的理解。

+2

'ARGV'是命令行參數。你想要的方法arity。 – Kris

回答

3

您可以使用method方法獲取方法作爲對象。然後調用arity來獲取該方法的參數個數。

MyClass.new.method(:some_method).arity 

__method__作爲符號返回當前方法的名稱。

全部放在一起:

class Foo 
    def bar(arg1, arg2) 
    self.method(__method__).arity # => 2 
    end 
end 
+1

我想你還應該提一下這樣一個事實:'Method#arity'爲默認參數的方法返回一個負數,它是什麼意思。 – toro2k

+1

@ toro2k同樣適用於'*'參數,雖然缺省值是'[]',但它們沒有明確定義爲默認值。更有意思的是'def some_method(arg1,* rest)'將會有一個'-2'。 – engineersmnky

+1

@engineersmnky你說得對,實際上'arity'在方法接受可變數量的參數時返回一個負整數,不管它們是否有默認值或者你有一個splatted參數。 – toro2k

0

關閉但不完全。該常量實際上包含傳遞給腳本而不是您的方法的所有參數。所以,如果你使用參數從命令行調用腳本,那麼它們將會保持不變。

如果一個名爲 「example.rb」 腳本包含:

puts ARGV.length 

,如果你把它稱爲像這樣的命令行:

> ruby example.rb 

你會得到0

如果你這樣稱呼它:

> ruby example.rb an_argument 

您將得到1

3

好了,首先沒有人提到,定義一個方法簽名這樣

def some_method(arg1,arg2,arg3) 

將需要3個參數,否則你將得到一個ArgumentError: wrong number of arguments (0 for 3)或事實你是如何傳入的。因此,在方法內引用arity是沒有用的,因爲在不知道需要的參數數量的情況下,你無法越過錯誤。

你可以定義但像

def some_method(*args) 
    puts args.size 
end 

這是一個方法,在傳遞將收集儘可能多還是少參數將他們包裹在一個數組例如

some_method 
0 
#=> nil 
some_method "a","b","c" 
3 
#=> nil 

這允許論點完全的靈活性,我認爲更多的是你有什麼根據,我如何讀您的文章正在尋找