передача функций как аргументы в рубине

Вы можете посмотреть на это: Как создать файл Excel (.XLS и .XLSX) в C # без установки MS Office? Вы можете просто использовать библиотеку через Mono и, в зависимости от того, что вы вы можете написать какую-нибудь утилиту оболочки или связать вашу программу с Mono и создать какой-нибудь тип обёрток. Похоже, что для этого конкретного приложения что-то в .NET - это то, где вы найдете наиболее полное решение, и тогда оно должно работать через Mono на linux.

5
задан Shalmanese 14 January 2009 в 19:11
поделиться

4 ответа

Ну, Вы сказали, что знаете о zip и карте, таким образом, это, вероятно, не полезно. Но я отправлю на всякий случай.

def combine a, b
    a.zip(b).map { |i| yield i[0], i[1] }
end

puts combine([1,2,3], [2,3,4]) { |i, j| i+j }

Нет, я не нахожу это красивым также.

редактирование - #ruby-lang irc.freenode.net предлагает это:

def combine(a, b, &block)
    a.zip(b).map(&block)
end

или это, если Вы хотите передать args:

def combine(a, b, *args, &block)
    a.zip(b, *args).map(&block)
end
10
ответ дан 18 December 2019 в 13:20
поделиться

Очень наивный подход:

def combine(a1, a2)
  i = 0
  result = []
  while a1[i] && a2[i]
    result << yield(a1[i], a2[i])
    i+=1
  end
  result
end

sum = combine([1,2,3], [2,3,4]) {|x,y| x+y}
prod = combine([1,2,3], [2,3,4]) {|x,y| x*y}

p sum, prod

=>
[3, 5, 7]
[2, 6, 12]

И с произвольными параметрами:

def combine(*args)
  i = 0
  result = []
  while args.all?{|a| a[i]}
    result << yield(*(args.map{|a| a[i]}))
    i+=1
  end
  result
end

Править: Я upvoted, решение для zip/карты, но вот немного улучшения, что ужасно об этом?

def combine(*args)
  args.first.zip(*args[1..-1]).map {|a| yield a}
end

sum = combine([1,2,3], [2,3,4], [3,4,5]) {|ary| ary.inject{|t,v| t+=v}}
prod = combine([1,2,3], [2,3,4], [3,4,5]) {|ary| ary.inject(1){|t,v| t*=v}}
p sum, prod
3
ответ дан 18 December 2019 в 13:20
поделиться

Вы кажетесь, что могли бы также хотеть Символ to_proc (код Раганвальдом)

class Symbol
  # Turns the symbol into a simple proc, which is especially useful for enumerations. 
  def to_proc
    Proc.new { |*args| args.shift.__send__(self, *args) }
  end
end

Теперь можно сделать:

(1..100).inject(&:+)

Отказ от ответственности: Я не Rubyist. Я точно так же, как функциональное программирование. Таким образом, это, вероятно, будет неподобно Ruby.

1
ответ дан 18 December 2019 в 13:20
поделиться

Можно передать название метода как символ и использование Object#send (или Object#__send__) позвать его по имени. (Ruby действительно не имеет функций, он имеет методы.)

Можно передать a lambda или блок, который называет Ваш требуемый метод для Ваших желаемых аргументов. Передающими блоками является, вероятно, предпочтительный Ruby путь, когда он работает (т.е. когда у Вас только есть единственный блок для передачи).

Вы получаете Method объекты непосредственно через Object#method и затем раздайте их и call их, но я имею небольшой опыт, делающий его этот путь, и не видел сделанный очень на практике.

0
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: