Ruby 如何紧凑地编写执行带有参数的方法的块
在以下代码中:Ruby 如何紧凑地编写执行带有参数的方法的块,ruby,Ruby,在以下代码中: def main someArray.all? { |item| checkSomething(item) } end private def checkSomething(arg) ... end 如何缩短all?语句以消除冗余的项变量 我正在寻找类似于someArray.all?(checkSomething)的东西,它会给出一个“错误的参数数”错误。您不能使用Ruby的收集方法“any”吗 def main #students is an arr
def main
someArray.all? { |item| checkSomething(item) }
end
private
def checkSomething(arg)
...
end
如何缩短all?
语句以消除冗余的项
变量
我正在寻找类似于
someArray.all?(checkSomething)
的东西,它会给出一个“错误的参数数”错误。您不能使用Ruby的收集方法“any”吗
def main
#students is an array of students
students.any?(&:passed)
end
class Student
def passed
#code to check if student passed
end
end
Ref如果checkSomething是一个item方法(即在“i”对象的类中定义),则可以使用符号来处理
def main
someArray.all?(&:checkSomething)
end
方法只能访问传递的参数,或访问self
,因此要绕过传递的参数,您需要使该方法成为对象类的实例方法(以便它可以使用self
)
你拥有它的方式。。。其中,
checkSomething
位于i
类的外部。。。您不能这样做。如果对象类上的方法是checkSomething
,那么您可以使用略短的代码。我不知道它是什么,所以我猜,您使用的是原语(数字、字符串等)。因此,类似这样的方法应该有效:
class Object
def check_something
# check self
end
end
some_array.all?(&:check_something)
但这当然是一种可怕的方式。以这种全球污染为代价节省几次按键——绝对不值得。此外,当您需要向check方法传递额外的参数时,即使是这个技巧也不可用
此外,原始代码的可读性也很好。您可以使用and(即&method
)来删除项
变量,尽管它速度较慢:
def main(array)
array.all?(&method(:check_something))
end
def check_something(arg)
arg.odd?
end
main [1,3,5] #=> true
main [1,3,6] #=> false
考虑到你想让你的对象的
checkSomething
保持私有,我认为这将是一个很好的解决办法:
class Something
def main
someArray.all?(&checkSomething)
end
private
def checkSomething
->(item) do
# Checking part.
end
end
end
对于执行带有参数的方法的块,请按以下方式签出
def main
someArray.all? &checkSomething(arg1, arg2, ...)
end
private
def checkSomething(arg1, arg2, ...)
Proc.new { |item| ..... }
end
项
变量在哪里?在OP中,不能使用#all?
。。因为它不接受任何参数作为参数。。你必须使用block。你实际上在调用someArray中没有任何参数的checkSomething
。all?(checkSomething)
,这就是它抱怨的原因。不,没有捷径了。to_proc
快捷方式(例如,ary.map(&:to_s)
)在这里不适用。@limekin我知道。。块是一个特殊的参数。all?
和any?
在这里有相同的约束。。。如果使用symbol进行处理,则该方法必须是Student
object方法(正如您所做的那样)。你的答案将与all?
以及any?
一起使用,因此从这个角度来看没有区别。我对all之间的区别做了一些研究?还有吗?有一个细微的差别…所以是的,根据您的要求,我同意您可以使用它们。它不会再短了,是吗?:)@SergioTulentsev使用较少的变量;-)是的,但是IIRC,使用方法
对性能的影响是不可忽略的。由OP决定什么更重要:)