2013-03-08 2 views
0

У меня есть функция, которая пересекает/трансверс что-то, и я хочу, чтобы она получила ссылку на функцию, которая устанавливает stop creiteria/что-то делать. Например, в классе:Передача ссылки на метод в Ruby на другой метод

def a(func_stop,i) 
    ret = nil # default 
    while(i < 0) 
     if (func_stop(@lines[i])) 
     ret = i 
     break 
     end 
    end 
    return ret 
end 

Идея заключается в том, что я могу передать ссылку на эту функцию, вроде как PERL'S

func1(\&func, $i); 

Я смотрел, но не смог найти что-то вроде этого. Thanks

+1

'i' не изменяется внутри цикла? – tokland

+0

@lines приходит откуда? – sunny1304

ответ

4

Обычно это делается с блоками.

def a(max, &func_stop) 
    puts "Processing #{max} elements" 
    max.times.each do |x| 
    if func_stop.call(x) 
     puts "Stopping" 
     break 
    else 
     puts "Current element: #{x}" 
    end 
    end 
end 

Тогда

a(10) do |x| 
    x > 5 
end 
# >> Processing 10 elements 
# >> Current element: 0 
# >> Current element: 1 
# >> Current element: 2 
# >> Current element: 3 
# >> Current element: 4 
# >> Current element: 5 
# >> Stopping 
0

Вы также можете попробовать это:

def a(func_stop,i) 
    ret = nil # default 
    while(i < 0) 
     if (func_stop.call(@lines[i])) 
     ret = i 
     break 
     end 
    end 
    return ret 
end 

a(method(:your_function), i)