블록은 CLR에 실제로 존재하지 않는 신비한 것입니다. 그러나 Ruby에는 CLR 대리자와 유사한 proc
이 있습니다.
예를 들어,이 잘 작동합니다 :
C 번호 :
public class SomeClass {
public static void Run(Func<int, int> func) { ... }
}
루비 :
이
proc = lambda { |i| i + 10 }
SomeClass.Run(proc)
(많은 사람들이 Proc.new
을 선호하지만, 그것을 새로운 발동을 만드는 방법에는 여러 가지가 있습니다 그래서 나는 람다를 선호하므로 C# 함수와 같은 방식으로 작동하지 않습니다.) 요점은 이것입니다 :
lambda
(및 Proc.new
)은 함수입니다. 블록에 함수를 전달하면 블록을 래핑하는 새 Proc
객체가 생성됩니다.
&
을 사용하여 블록을 함수에 전달할 때 암시 적으로 블록을 procs로 변환하는 방법이 있습니다.
루비 :
def each
yield 1
end
는
def each(&block)
block.call 1
end
&
동일하다 (달리 내재적 yield
호출 됐을) 메소드에 전달 된 블럭을 취하여 변환 Proc
으로 일단 proc이면 proc을 전달하거나, 배열에 집어 넣거나, C#으로 전달할 수 있습니다.
이 블록을 소요하고, PROC로 변환 &
를 사용하는 래퍼 방법을 만들기 :
그래서, 당신의 C# 메서드를 호출, 두 가지 옵션이 있습니다. 그런 다음이 proc을 사용하여 기본 C# 메서드를 호출 할 수 있습니다.
ruby에서 또는 Proc.new
을 사용하여 직접 proc을 만들고이를 C# 메서드에 전달합니다.
예 :
C# 코드 (공통)
public static class MyClass
{
public static void Print(Func<int, int> converter)
{
Console.WriteLine("1: {0}", converter(1));
}
}
루비 코드 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}
루비 코드 2 (직접)
MyClass.print lambda{|i| i * 10}
원더풀! – sipwiz