我試圖編寫一個函數,如果它不是一個集合,將函數應用於一個項目,否則將該函數應用於每個集合元素。例如:如何讓紅寶石功能接受單個項目或項目集合,並做同樣的事情?
用下劃線代替空格
foo 'a bear' => 'a_bear'
foo ['a bear', 'a bee'] => ['a_bear', 'a_bee']
這可能嗎?
我試圖編寫一個函數,如果它不是一個集合,將函數應用於一個項目,否則將該函數應用於每個集合元素。例如:如何讓紅寶石功能接受單個項目或項目集合,並做同樣的事情?
foo 'a bear' => 'a_bear'
foo ['a bear', 'a bee'] => ['a_bear', 'a_bee']
這可能嗎?
這取決於你如何定義「集合」。最自然的選擇可能是「任何可枚舉」或甚至「每種方法的任何東西」。但是這會導致問題,因爲字符串也是可枚舉的 - 至少在紅寶石1.8中。
如果你只需要使用數組的工作,很容易:
def foo(x)
if x.is_a? Array
x.map {|item| foo(item)}
else
# Do something with x
end
end
不知道如果我誤讀的問題或沒有。下面的內容將使它成爲一個函數,它將以同樣的方式處理單個元素或一組元素。只是數組 - 如果參數不是數組,則返回參數,並在必要時解除該參數。
def foo(x)
x = [x] unless x.is_a? Array
# do array stuff to x
return result.size > 1 ? result : result.first
end
不是非常確切;如果x == []或x == [1]會發生什麼? – steenslag 2010-09-10 07:09:23
您可能感興趣的圖示操作
def foo(x)
[*x].map {|item| item.gsub(" ", "_")}
end
不幸的是,this'd返回foo("a bear")
爲["a_bear"]
,而不是"a_bear"
沒有數組。
還有一種方法,結果相同:'[x] .flatten.map {' – Nakilon 2010-09-27 11:16:26
個人而言,我會用變量ARGS:
def foo(*args)
args.each { |arg| puts arg }
end
foo("bar") # bar
foo("bar", "foobar") # bar \n foobar
foo(*%w(bar foobar)) # bar \n foobar
a = ["bar", "foobar"]
foo(*a) # bar \n foobar
foo("baz", *a) # baz \n bar \n foobar
a = "bar"
foo(*a) # bar
如果你不知道你的說法是否是一個字符串或數組,然後只需用*
前面加上它。
我發現這給了最大的靈活性,當處理數組可能是一個單一的值,因爲我可以輸入它們只是參數,如果我初始化數組或安全地傳入變量,如果我知道它將要麼數組或單個參數。它會在哈希上窒息。
是的。你嘗試了什麼? – 2010-09-09 19:43:49