2017-07-13 98 views
0

我有一個字符串數組。這個數組中的一些字符串包含我正在查找的某個子字符串。我想獲得包含子字符串的字符串數組。Ruby從包含子串的數組中獲取字符串

我希望做這樣的:

a = ["abc", "def", "ghi"] 
o.select(&:include?("c")) 

但是,這給了我這個錯誤:

(repl):2: syntax error, unexpected ')', expecting end-of-input 
o.select(&:include?("c")) 
         ^
+0

需要使用塊'o.select {| e | e.include?('c')}' –

+6

'['abc','def','ghi']。grep(/ c /)'也可以。 – Stefan

+1

您正在嘗試使用所謂的「椒鹽脆餅結腸」語法,但像@SebastiánPalma所說,它不接受參數。查看這兩個文檔,瞭解更多關於椒鹽脆餅結腸語法的內容:http://technology.customink.com/blog/2015/06/08/ruby-pretzels/和https://stackoverflow.com/questions/1961030/ruby-ampersand-冒號 - 快捷鍵 – anothermh

回答

2

你就要成功了,你不能在&:傳遞參數。你可以這樣做:

o.select{ |e| e.include? 'c' } 
4

可以使用&簡寫,在這裏。這是非常不合理的(不要這樣做),但可能的。

如果你設法找到一個對象和方法,這樣就可以使支票在select像這樣:

o.select { |e| some_object.some_method(e) } 

(的重要組成部分,是some_objectsome_method需要在所有相同迭代)

...然後你可以使用Object#method來獲得這樣的塊。它返回一些實現to_proc(對& -shorthand的要求),並在調用時調用some_methodsome_object,將其參數傳遞給它。有點像:

o.m(a, b, c) # <=> o.method(:m).to_proc.call(a, b, c) 

這裏是你如何利用此功能&簡寫,:

collection.select(&some_object.method(:some_method)) 

在這種特殊情況下,/c/及其方法=~做的工作:

["abc", "def", "ghi"].select(&/c/.method(:=~)) 

均田詳細,可讀性比較差。
再一次,不要在這裏這樣做。但這個竅門在其他情況下可能會有所幫助。

+0

漂亮漂亮!我以前沒見過。 –

+0

該答案屬於https://codegolf.stackexchange.com ;-)真棒快捷鍵! – Stefan

+0

@Stefan nah,由於冗長的「.method」,它的使用往往比通常的定義更長。所以我不能在高爾夫球場中提出任何用例。除了......競爭最少數量的令牌時。 –

5

如果陣列是一個文件lines.txt

abc 
def 
ghi 

,那麼你會選擇包含cgrep命令行實用程序行:

$ grep c lines.txt 
abc 

紅寶石都採用了這一爲Enumerable#grep。可以傳遞一個正則表達式作爲圖案,並將它返回匹配該模式的字符串:

['abc', 'def', 'ghi'].grep(/c/) 
#=> ["abc"] 

更具體地,結果數組包含的所有元素爲哪些pattern === element爲真:

/c/ === 'abc' #=> true 
/c/ === 'def' #=> false 
/c/ === 'ghi' #=> false 
+2

另一個例子(儘管這裏不適用)是'[「a」,1,{b:2},[3,4],{c:5}]。grep(Hash)#=> [{b:2} ,{c 5}]',因爲'Hash === {b:2}'相當於'{b:2} .instance_of?(Hash)#=> true'。 –

相關問題