开发者

How to call a C# IEnumerable from IronRuby

I have a C# method:

  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);
      }
    }
  }

I can call this fine in IronPython:

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

But I don't see how to call this from IronRuby:

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

All I get back is Graphics+<getPixels>c__It开发者_C百科erator0.

What do I need to do to actually get each pixel in IronRuby and process it?


From Jimmy Schementi:

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

If you change the return type of getPixels to IEnumerable, then this works:

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

And arguably it should be IEnumerable rather than IEnumerator, as an IEnumerable.GetEnumerator() gives you an IEnumerator.

Your code example passes a closure to the getPixels method, which just gets ignored (all Ruby methods syntactically accept a block/closure, and they can choose to use it), and returns the IEnumerator.

IronRuby today doesn't support mapping Ruby's Enumerable module to IEnumerator objects, since it's kind awkward to return an IEnumerator rather than an IEnumerable from a public API, but since IronPython sets a precedence for supporting it we should look into it. Opened http://ironruby.codeplex.com/workitem/6154.

~Jimmy

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜