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决定什么更重要:)