我看到有在Ruby中一個相對較新的功能,它允許鏈式迭代 - 換句話說,而不是each_with_indices { |x,i,j| ... }
你可能會做each.with_indices { |x,i,j| ... }
,其中#each
返回Enumerator
對象,Enumerator#with_indices
導致額外的產量參數被包括在內。在Ruby的C擴展實現鏈接的迭代器
因此,Enumerator
有其自己的方法#with_index
,大概是一維對象,source found here。但我無法弄清楚將其適用於其他對象的最佳方法。
要清晰,響應評論: Ruby沒有一個#each_with_indices
現在 - 這只是有一個#each_with_index
。 (這就是爲什麼我要創建一個)
一連串的問題,自己的鏈接:
- 一個怎樣適應鏈式迭代到一個維對象?只需做一個
include Enumerable
? - 推測上述(#1)不適用於n三維對象。會創建一個
EnumerableN
類,從Enumerable
派生,但#with_index
轉換爲#with_indices
? - 可以使用C編寫的Ruby擴展完成#2嗎?例如,我有一個矩陣類,它存儲各種類型的數據(浮點數,雙精度數,整數,有時是常規的Ruby對象,等)。枚舉需要首先根據下面的示例檢查數據類型(
dtype
)。
例子:
VALUE nm_dense_each(VALUE nm) {
volatile VALUE nm = nmatrix; // Not sure this actually does anything.
DENSE_STORAGE* s = NM_STORAGE_DENSE(nm); // get the storage pointer
RETURN_ENUMERATOR(nm, 0, 0);
if (NM_DTYPE(nm) == nm::RUBYOBJ) { // matrix stores VALUEs
// matrix of Ruby objects -- yield those objects directly
for (size_t i = 0; i < nm_storage_count_max_elements(s); ++i)
rb_yield(reinterpret_cast<VALUE*>(s->elements)[i]);
} else { // matrix stores non-Ruby data (int, float, etc)
// We're going to copy the matrix element into a Ruby VALUE and then operate on it. This way user can't accidentally
// modify it and cause a seg fault.
for (size_t i = 0; i < nm_storage_count_max_elements(s); ++i) {
// rubyobj_from_cval() converts any type of data into a VALUE using macros such as INT2FIX()
VALUE v = rubyobj_from_cval((char*)(s->elements) + i*DTYPE_SIZES[NM_DTYPE(nm)], NM_DTYPE(nm)).rval;
rb_yield(v); // yield to the copy we made
}
}
}
所以,我的三個問題合而爲一:我怎麼會寫,在C,一個#with_indices
到鏈到上述NMatrix#each
方法?
我並不特別想讓任何人覺得我要求他們爲我編碼,但如果您確實想要,我們很樂意讓您參與我們的項目。 =)
但是如果你知道網絡上其他地方的一些例子如何完成這個例子,那麼這將是完美的 - 或者如果你可以用文字解釋,那也是可愛的。
不,沒有這樣的功能。 Ruby 1.9中沒有提及任何內容。 Ruby 2.0中沒有提到你提到的這種東西。然而,Ruby有一個不同的東西叫'each_with_index'。 Ruby 1.9引入了'with_index'。 – sawa 2013-05-02 06:29:38
好的,解決了我的問題 - 現在已經是Ruby的一般了。你有沒有下降?我可以問爲什麼?這是一個非常仔細的書面問題。 – 2013-05-02 15:19:29
@sawa:他不問Ruby的功能。這是一個高層次的問題,他是一個開發人員,可能是NMatrix團隊的一員,他基本上要求在C中編寫Ruby方法的Ruby方式是什麼:-)我是(目前)Marc-Andre的Matrix用戶,以及我很高興有NMatrix作爲替代方案。 – 2013-05-02 15:34:19