我想在不运行两次功能的情况下找到最大数量
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
答案 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