[英]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
的迭代,我想讓最后一個parameter
( 30 )進入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.