2011-05-23 21 views
4

我有一個C#方法:如何調用C#的IEnumerable從IronRuby的

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中的每個像素並處理它?

+0

我不能直接回答你的問題,但有領悟力灰色計算的innacuracy:它應該是RGB和0.3,0.59,0.11的點積。人們在不同的顏色中使用不同的亮度。如果您想表示顏色的先行亮度,所有這些都適用。 – 2011-05-23 22:15:30

+0

你是對的:這不是一個直接的答案。甚至沒有間接的答案:)人們對RGB的亮度不相等地感知也是正確的,並且RGB加權有許多可能的值來製作更令人愉快的灰度圖像。但是這與手頭的問題無關(而且代碼實際上是製作完美的灰度圖像)。現在我需要弄清楚如何在IronRuby中調用Generator ... – 2011-05-23 22:37:47

回答

3

從吉米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的可枚舉模塊 IEnumerator的對象,因爲它是一種尷尬,從一個公共API返回一個IEnumerator 而不是一個IEnumerable,但由於IronPython的 設置了優先支持它,我們應該看看進去。打開 http://ironruby.codeplex.com/workitem/6154

〜吉米