如何紧凑地编写一个执行带参数的方法的块

时间:2015-07-06 11:21:29

标签: ruby

在以下代码中:

def main
  someArray.all? { |item| checkSomething(item) }
end

private
  def checkSomething(arg)
    ...
  end

如何缩短all?语句以便删除多余的item变量?

我正在寻找像someArray.all?(checkSomething)这样的“错误数量的参数”错误。

6 个答案:

答案 0 :(得分:3)

如果checkSomething是对象类的方法,则可以使用稍短的代码。不知道它是什么,所以,我猜,你正在使用原语(数字,字符串等)。所以这样的事情应该有效:

class Object
  def check_something
    # check self
  end
end

some_array.all?(&:check_something)

但是,这当然是一种可怕的,可怕的方式。以这种全球污染为代价省去一些按键 - 绝对不值得。此外,只要您需要将其他参数传递给检查方法,即使这个技巧也无法使用。

此外,原始代码也非常易读。

答案 1 :(得分:3)

您可以使用Object#methodMethod#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)

你可以不使用Ruby的收集方法吗?'代替?

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