Ruby找到最大数量没有运行方法两次

时间:2014-03-11 21:14:01

标签: ruby function max

我想在不运行两次功能的情况下找到最大数量

def foo(num)
    num * 10
end

def bar
    x = 0
    for i in 0..5
         if foo(i) > x
             x = foo(i) # I don't want to run foo a second time
         end
    end
end

6 个答案:

答案 0 :(得分:4)

怎么样

def bar
  (1..5).map{|i| foo(i)}.max
end

这将遍历1到5,并使用foo(i)而不是i最多一个新的可枚举,然后返回最大值。

答案 1 :(得分:3)

如果你想要x:

的值
define_method(:foo) { |x| x * 10 } 

(1..5).max_by { |x| foo(x) }                                             
#=> 5

如果你想要f(x)的值:

(1..5).map { |x| foo(x) }.max
#=> 50

答案 2 :(得分:1)

您可以将函数的结果保存为变量,以便以后可以使用它而无需再次调用该函数。

应用于您的代码示例,它看起来像这样:

#...
fooOfI = foo(i)
if fooOfI > x
    x = fooOfI
end
#...

答案 3 :(得分:0)

将方法的结果存储在局部变量中。

def bar
  x = 0
  for i in 0..5
    foo_result = foo i
    if foo_result > x
      x = foo_result
    end
  end
end

答案 4 :(得分:0)

我会对您的代码进行一些更改:

def foo(num)
    num * 10
end

def bar
    x = 0
    for i in 0..5
      _,x = [foo(i),x].sort #or you can write as x = [foo(i),x].max
    end
    x
end

p bar
# >> 50

答案 5 :(得分:0)

优雅而简单

foo = -> x { x * 10 }
(1..5).map(&foo).max
# => 50

在一次迭代中(没有那么优雅但表现更好)

def foo(num); num * 10; end;
(1..5).reduce(-1.0/0) { |a, e| f = foo(e); f > a ? f : a }
# => 50