簡體   English   中英

Ruby Proc with Parameter

[英]Ruby Proc with Parameter

我正在嘗試將參數發送到Ruby proc

p1 = [54, 21, 45, 76, 12, 11, 67, 5]

qualify = proc { |age, other| age > other }

puts p1.select(&qualify(30))

這是我得到的錯誤:

undefined method `qualify' for main:Object

age來自array的迭代,我想讓最后一個parameter30 )進入proc

proc是一個正確的工具嗎? 我是新來的。 我不清楚如何在那里獲得該parameter

為了使用qualify作為select謂詞,您需要通過部分應用程序減少其arity(接受的參數的數量)。 換句話說 - 你需要一個新的proc, other設置為30 它可以使用Method#curry ,但它需要更改參數的順序:

qualify = proc { |other, age| age > other }
qualify.curry.call(30).call(10)
# => false
qualify.curry.call(30).call(40)
#=> true

我命令能夠通過此proc來選擇使用& ,您需要分配它以便它在主對象中可用,例如通過將其分配給實例變量:

@qualify_30 = qualify.curry.call(30)

現在你可以打電話:

p1.select{ |age| @qualify_30.call(age)  }
# => [54, 45, 76, 67]

要么:

p1.select(&@qualify_30)
# => [54, 45, 76, 67]

或內聯:

p1.select(&qualify.curry.call(30))
# => [54, 45, 76, 67]

簡單的方法是改變你如何定義它:

p1 = [54, 21, 45, 76, 12, 11, 67, 5]

qualify = proc { |age| age > 30 }

puts p1.select(&qualify).join(',')

通過將30移動到你在條件下烘焙的qualify觸發器,它不再是動態的。 請記住,可以與速記&:技巧一起使用的唯一方法是零參數,或者在proc上使用&單個參數。

您還可以使用閉包來公開比較變量:

p1 = [54, 21, 45, 76, 12, 11, 67, 5]

required = 30

qualify = proc { |age| age > required }

puts p1.select(&qualify).join(',')

required = 10

puts p1.select(&qualify).join(',')

更好的方法是拼出來,這就是Ruby的全部內容。 這是一個更慣用的形式:

p1 = [54, 21, 45, 76, 12, 11, 67, 5]

puts p1.select { |age| age > 30 }

中間Proc的唯一原因是,出於某種原因,您希望將其保存在某個地方並在以后重新使用它。

在proc本身中使​​用select語句,以便proc計算並返回一個數組。

2.1.5 :119 >   qualify = proc { |age_array, age_limit| age_array.select { |age| age > age_limit } }
 => #<Proc:0xe7bc2cc@(irb):119> 
2.1.5 :120 > 
2.1.5 :121 >   
2.1.5 :122 >   qualify.call(p1, 30)
 => [54, 45, 76, 67] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM