Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带参数的Ruby进程_Ruby_Lambda_Proc - Fatal编程技术网

带参数的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是用于此目的的正确工具吗?我是新手。我不清楚如何在那里获

我正在尝试向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来自
数组的迭代,我想要最后一个
参数
30)进入
过程


proc
是用于此目的的正确工具吗?我是新手。我不清楚如何在那里获取
参数

为了在as
select
谓词中使用
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]