如何从IronRuby调用C#IEnumerable

时间:2011-05-23 22:06:57

标签: c# ruby ienumerable ironruby

我有一个C#方法:

  public static IEnumerator getPixels(Picture picture) {
    for (int x=0; x < picture.width; x++) {
      for (int y=0; y < picture.height; y++) {
    yield return picture.getPixel(x, y);
      }
    }
  }

我可以在IronPython中称之为:

for pixel in getPixels(pic):
    r, g, b = getRGB(pixel)
    gray = (r + g + b)/3
    setRGB(pixel, gray, gray, gray)

但我不知道如何从IronRuby中调用它:

Myro::getPixels(pic) do |pixel|
    r, g, b = Myro::getRGB pixel
    gray = (r + g + b)/3
    Myro::setRGB(pixel, gray, gray, gray)
end

我回来的只有Graphics+<getPixels>c__Iterator0.

我需要做些什么来实际获取IronRuby中的每个像素并进行处理?

1 个答案:

答案 0 :(得分:3)

来自Jimmy Schementi:

http://rubyforge.org/pipermail/ironruby-core/2011-May/007982.html

如果将getPixels的返回类型更改为IEnumerable,则可以使用:

Myro::getPixels(pic).each do |pixel|
    ...
end

可以说它应该是IEnumerable而不是IEnumerator IEnumerable.GetEnumerator()为您提供了IEnumerator。

您的代码示例将闭包传递给getPixels方法,该方法就是这样 被忽略(所有Ruby方法在语法上都接受一个块/闭包, 并且他们可以选择使用它),并返回IEnumerator。

IronRuby今天不支持将Ruby的Enumerable模块映射到 IEnumerator对象,因为返回IEnumerator很尴尬 而不是来自公共API的IEnumerable,而是来自IronPython 设定支持它的优先级我们应该研究它。开业 http://ironruby.codeplex.com/workitem/6154

〜麦