2014-03-11 5 views

ответ

3

Если вы хотите, значение х:

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

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

Если вы хотите, чтобы значение F (х):

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

Почему я получаю (IRB)? NoMethodError: неопределенный метод 'define_method 'для main: Object. –

+0

Ruby версия? Работает в 2.X: 'irb (main): 002: 0> define_method (: foo) {| x | 10 * x} => # ' –

+0

Я пробовал в версии 1.9.3. В соответствии с этим существует http://ruby-doc.org/core-1.9.3/Module.html#method-i-define_method. –

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

Как насчет

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

Это будет проходить с 1 по 5, а не более новый перечислимы с foo(i) вместо i, а затем вернуть макс.

1

Вы можете сохранить результат функции как переменную, поэтому вы можете использовать ее позже, не вызывая функцию снова.

Применительно к вашему примеру кода, он будет выглядеть следующим образом:

#... 
fooOfI = foo(i) 
if fooOfI > x 
    x = fooOfI 
end 
#... 
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 
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 
Смежные вопросы