Блок - загадочная вещь, которой на самом деле нет в CLR. Однако в Ruby есть proc
, аналогичный делегатам CLR.
Например, это должно работать нормально:
C #:
public class SomeClass {
public static void Run(Func<int, int> func) { ... }
}
Ruby:
proc = lambda { |i| i + 10 }
SomeClass.Run(proc)
Существует несколько способов создания новых процедур (многие люди предпочитают Proc.new
, но это не совсем работает так же, как функция C #, поэтому я предпочитаю лямбду), но ключевой момент таков:
lambda
(и Proc.new
) - это функция - вы передаете функции блок, и она генерирует новый объект Proc
, который оборачивает блок.
Существует также способ неявного преобразования блоков в процы при их передаче в функцию с использованием &
.
Ruby:
def each
yield 1
end
совпадает с
def each(&block)
block.call 1
end
&
берет блок, который был передан методу (который в противном случае был бы неявно вызван yield
), и преобразует его в Proc
. Как только это будет процесс, вы можете передать его, вставить в массив или передать его в C #.
Итак, для вызова вашего метода C # у вас есть две опции:
Создайте метод-обертку, который принимает блок и использует &
для преобразования его в процедуру. Затем вы можете вызвать базовый метод C # с помощью этой процедуры
Используйте lambda
или Proc.new
в ruby для непосредственного создания процедуры и передачи ее методу C #.
Примеры:
Код C # (общий):
public static class MyClass
{
public static void Print(Func<int, int> converter)
{
Console.WriteLine("1: {0}", converter(1));
}
}
Ruby Code 1 (обертка):
class MyClass
class << self # this is only needed to alias class (static) methods, not for instance methods
alias_method :original_print, :print
end
def self.print(&block)
original_print block
end
end
MyClass.print {|i| i * 10}
Ruby Code 2 (direct):
MyClass.print lambda{|i| i * 10}