Как вызвать C # IEnumerable от IronRuby - PullRequest
4 голосов
/ 24 мая 2011

У меня есть метод 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 Ответ

3 голосов
/ 25 мая 2011

От Джимми Схементи:

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 не поддерживает отображение модуля Enumerable Ruby на объекты IEnumerator, поскольку довольно неудобно возвращать IEnumerator, а не IEnumerable из открытого API, но поскольку IronPython устанавливает приоритет для его поддержки, мы должны рассмотреть его.Открыт http://ironruby.codeplex.com/workitem/6154.

~ Джимми

...