Вы можете посмотреть на это: Как создать файл Excel (.XLS и .XLSX) в C # без установки MS Office? Вы можете просто использовать библиотеку через Mono и, в зависимости от того, что вы вы можете написать какую-нибудь утилиту оболочки или связать вашу программу с Mono и создать какой-нибудь тип обёрток. Похоже, что для этого конкретного приложения что-то в .NET - это то, где вы найдете наиболее полное решение, и тогда оно должно работать через Mono на linux.
Ну, Вы сказали, что знаете о 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
Очень наивный подход:
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
Вы кажетесь, что могли бы также хотеть Символ 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.
Можно передать название метода как символ и использование Object#send
(или Object#__send__
) позвать его по имени. (Ruby действительно не имеет функций, он имеет методы.)
Можно передать a lambda
или блок, который называет Ваш требуемый метод для Ваших желаемых аргументов. Передающими блоками является, вероятно, предпочтительный Ruby путь, когда он работает (т.е. когда у Вас только есть единственный блок для передачи).
Вы получаете Method
объекты непосредственно через Object#method
и затем раздайте их и call
их, но я имею небольшой опыт, делающий его этот путь, и не видел сделанный очень на практике.