在以下代码中:
def main
someArray.all? { |item| checkSomething(item) }
end
private
def checkSomething(arg)
...
end
如何缩短all?
语句以便删除多余的item
变量?
我正在寻找像someArray.all?(checkSomething)
这样的“错误数量的参数”错误。
答案 0 :(得分:3)
如果checkSomething
是对象类的方法,则可以使用稍短的代码。不知道它是什么,所以,我猜,你正在使用原语(数字,字符串等)。所以这样的事情应该有效:
class Object
def check_something
# check self
end
end
some_array.all?(&:check_something)
但是,这当然是一种可怕的,可怕的方式。以这种全球污染为代价省去一些按键 - 绝对不值得。此外,只要您需要将其他参数传递给检查方法,即使这个技巧也无法使用。
此外,原始代码也非常易读。
答案 1 :(得分:3)
您可以使用Object#method
和Method#to_proc
(即&method
)删除item
变量,但速度较慢:
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
答案 2 :(得分:1)
如果checkSomething是一个item方法(即在'i'对象的类中定义),你可以用符号来处理...
def main
someArray.all?(&:checkSomething)
end
方法只能访问传递的参数,或访问self
所以绕过传递参数,你需要使方法成为对象类的实例方法(所以它可以使用self
)
你拥有它的方式...... checkSomething
类在i
类的外部......你不能这样做。
答案 3 :(得分:0)
考虑到您希望保持对象的class Something
def main
someArray.all?(&checkSomething)
end
private
def checkSomething
->(item) do
# Checking part.
end
end
end
私有,我认为这将是一个很好的解决方法:
&
答案 4 :(得分:0)
对于使用参数执行方法的块,以这种方式Checkout ...
def main
someArray.all? &checkSomething(arg1, arg2, ...)
end
private
def checkSomething(arg1, arg2, ...)
Proc.new { |item| ..... }
end
答案 5 :(得分:-3)
def main
#students is an array of students
students.any?(&:passed)
end
class Student
def passed
#code to check if student passed
end
end
参考http://ruby-doc.org/core-2.2.2/Enumerable.html#method-i-any-3F