带参数的Ruby进程
我正在尝试向Ruby带参数的Ruby进程,ruby,lambda,proc,Ruby,Lambda,Proc,我正在尝试向Rubyproc 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来自数组的迭代,我想要最后一个参数(30)进入过程 proc是用于此目的的正确工具吗?我是新手。我不清楚如何在那里获
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来自数组的迭代,我想要最后一个参数(30)进入过程
proc
是用于此目的的正确工具吗?我是新手。我不清楚如何在那里获取参数 为了在asselect
谓词中使用qualify
,您需要通过部分应用减少其arity(接受的参数数量)。换句话说,您需要一个新的proc,它将other
设置为30
。可以使用,但需要更改参数顺序:
qualify = proc { |other, age| age > other }
qualify.curry.call(30).call(10)
# => false
qualify.curry.call(30).call(40)
#=> true
为了能够通过此过程使用&
进行选择,您需要分配它,以便它在主对象中可用,例如,通过将其分配给实例变量:
@qualify_30 = qualify.curry.call(30)
现在您可以拨打:
p1.select{ |age| @qualify_30.call(age) }
# => [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
过程中,它不再是动态的。记住,在一个过程中,可以使用速记&:
技巧的唯一方法是零参数方法,或者是带有&
的单参数方法
还可以使用闭包公开比较变量:
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 }
中间过程的唯一原因是,如果出于某种原因,您希望将其保存在某个位置,并在以后重新使用它。请在过程本身中使用select语句,以便过程计算并返回数组
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]
2.1.5:119>qualify=proc{age|u数组,age|u限制{age|u数组。选择{{age}age>age|u限制}
=> #
2.1.5 :120 >
2.1.5 :121 >
2.1.5:122>合格呼叫(p1,30)
=> [54, 45, 76, 67]
所需的返回值是什么?我想输入'30'作为值超过30的返回数组的变量。但这不仅仅是这个例子。我想要一个通用的procs
,我可以在那里抛出params
。但是我正在尝试实现proc
版本,这样我就可以学习它们了。你想在这里做什么,currying?我不知道这个词。我认为在进程中加入一个参数是正常的。我正在查看其他回复。最后,您可以执行p1.select(&@qualify_30)
,也可以像p1那样内联执行。select(&qualify.curry.call(30))
除非需要持久化实例变量,否则不需要使用实例变量,如果需要,可以改为常量。您也可以使用较短的表示法:@qualify\u 30[40]
其中[]
是调用的别名“可以使用的唯一方法…是零参数方法”-但是qualify
这里的arity为1。这甚至不是一种方法。也许,这个断言可以以某种方式重写。当然,也可以使用带有参数的方法。因为&
没有看到方法调用。只有它的结果。我看到您已将required从角色中删除为参数
,因此在我看来,这实际上只是另一个硬编码的proc
。真的不尊重DRY
。我认为很容易加入参数
。非常好。所以你只是把数组作为变量本身扔进了进程。我被迭代器卡住了。
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]