我有一个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 中的每个像素并对其进行处理?
来自 Jimmy Schementi:
http://rubyforge.org/pipermail/ironruby-core/2011-May/007982.html
如果将 getPixel 的返回类型更改为 IEnumerable,则此方法有效:
Myro::getPixels(pic).each do |pixel|
...
end
可以说,它应该是IEnumerable而不是IEnumerator,作为一个IEnumerable.GetEnumerator() 为您提供了一个 IEnumerator。
您的代码示例将闭包传递给 getPixel 方法,该方法只是被忽略(所有 Ruby 方法在语法上都接受块/闭包,他们可以选择使用它),并返回 IEnumerator。
IronRuby 目前不支持将 Ruby 的 Enumerable 模块映射到IEnumerator 对象,因为返回 IEnumerator 有点尴尬而不是来自公共 API 的 IEnumerable,但自从 IronPython设置支持它的优先级,我们应该研究它。打开http://ironruby.codeplex.com/workitem/6154。
~吉 米