Ruby 带参数的过程
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
是用于此目的的正确工具吗?我是 proc 的新手。我不清楚如何在其中获取 parameter
。
为了在 as select
谓词中使用 qualify
,您需要通过部分应用来减少其数量(接受的参数的数量)。换句话说 - 你需要一个新的 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
我为了能够使用 &
将此过程传递给 select,您需要分配它以便它在主对象中可用,例如通过将其分配给实例变量:
@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
过程中,它不再是动态的。请记住,唯一可以与 shorthand &:
技巧一起使用的方法是零参数方法,或者在 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 计算并 return 一个数组。
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]
我正在尝试将参数发送到 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
是用于此目的的正确工具吗?我是 proc 的新手。我不清楚如何在其中获取 parameter
。
为了在 as select
谓词中使用 qualify
,您需要通过部分应用来减少其数量(接受的参数的数量)。换句话说 - 你需要一个新的 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
我为了能够使用 &
将此过程传递给 select,您需要分配它以便它在主对象中可用,例如通过将其分配给实例变量:
@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
过程中,它不再是动态的。请记住,唯一可以与 shorthand &:
技巧一起使用的方法是零参数方法,或者在 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 计算并 return 一个数组。
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]