Thibaut Barrère
2009-Nov-20 15:17 UTC
[Ironruby-core] Difficulties grasping generics + IronRuby - any idea? (OpenXML)
Hi,
I''m testing out the OpenXML SDK with IronRuby (0.9.2). Turns out
it''s full
of generics in there, a good play field.
Here I''m trying to use the API to retrieve a list of sheets in an
existing
xslx.
I''m having a hard-time understanding why I can''t call
"b.first" in the next
snippet (full version at http://gist.github.com/239555):
doc = SpreadsheetDocument.open(''docs/single-cell.xlsx'', false)
a = doc.workbook_part.workbook.method(:get_first_child).of(Sheets).call
puts a
# -> DocumentFormat.OpenXml.Spreadsheet.Sheets
b = a.method(:elements).of(Sheet).call
puts b
# ->
DocumentFormat.OpenXml.OpenXmlElementList+<OfType>d__0`1[DocumentFormat.OpenXml.Spreadsheet.Sheet]
# b.first or anything similar fails
*
*
It turns out that b.methods shows a "to_a" method is available, then I
can
do :
puts b.to_a.first # woot!
# -> DocumentFormat.OpenXml.Spreadsheet.Sheet
So my questions are:
- why can''t I call b.first ? (maybe there''s something obvious
I didn''t see -
I assume it''s probably that)
- are there better ways of writing this ?
And if you are interested to follow (I really need to wrap some ruby sugar
around all this to make it easier to work with), I''ll push my
experiments
here:
http://github.com/thbar/openxml-labs
thanks,
Thibaut
--
http://www.learnivore.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/ironruby-core/attachments/20091120/44868d67/attachment.html>
Ryan Riley
2009-Nov-20 19:02 UTC
[Ironruby-core] Difficulties grasping generics + IronRuby - any idea? (OpenXML)
You can''t call a C# extension method off of the object. You might try creating a mixin to add a method_missing to catch and call the appropriate extensions. Otherwise, I think you have to call them as static members, e.g. Enumerable.First.Of(Sheet).call(b). That looks horrifying, I know. I don''t have IR available on this machine, or I would try it myself. Let me know how that goes. This seems like it will be a fairly common problem for things like LINQ, PFx and Rx. Maybe we can come up with a simple, one-size-fits-all solution? Ryan Riley Email: ryan.riley at panesofglass.org LinkedIn: http://www.linkedin.com/in/ryanriley Blog: http://wizardsofsmart.net/ Website: http://panesofglass.org/ On Fri, Nov 20, 2009 at 9:17 AM, Thibaut Barr?re <thibaut.barrere at gmail.com>wrote:> Hi, > > I''m testing out the OpenXML SDK with IronRuby (0.9.2). Turns out it''s full > of generics in there, a good play field. > > Here I''m trying to use the API to retrieve a list of sheets in an existing > xslx. > > I''m having a hard-time understanding why I can''t call "b.first" in the next > snippet (full version at http://gist.github.com/239555): > > doc = SpreadsheetDocument.open(''docs/single-cell.xlsx'', false) > > > > a = doc.workbook_part.workbook.method(:get_first_child).of(Sheets).call > > puts a > > # -> DocumentFormat.OpenXml.Spreadsheet.Sheets > > > > b = a.method(:elements).of(Sheet).call > > puts b > > # -> DocumentFormat.OpenXml.OpenXmlElementList+<OfType>d__0`1[DocumentFormat.OpenXml.Spreadsheet.Sheet] > > > > # b.first or anything similar fails > > * > > * > > It turns out that b.methods shows a "to_a" method is available, then I can > do : > > puts b.to_a.first # woot! > > # -> DocumentFormat.OpenXml.Spreadsheet.Sheet > > > So my questions are: > - why can''t I call b.first ? (maybe there''s something obvious I didn''t see > - I assume it''s probably that) > - are there better ways of writing this ? > > And if you are interested to follow (I really need to wrap some ruby sugar > around all this to make it easier to work with), I''ll push my experiments > here: > > http://github.com/thbar/openxml-labs > > thanks, > > Thibaut > -- > http://www.learnivore.com > > _______________________________________________ > Ironruby-core mailing list > Ironruby-core at rubyforge.org > http://rubyforge.org/mailman/listinfo/ironruby-core > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20091120/29bc2a42/attachment.html>
Thibaut Barrère
2009-Nov-20 20:55 UTC
[Ironruby-core] Difficulties grasping generics + IronRuby - any idea? (OpenXML)
Hi Ryan, You can''t call a C# extension method off of the object. You might try> creating a mixin to add a method_missing to catch and call the appropriate > extensions. Otherwise, I think you have to call them as static members, e.g. > Enumerable.First.Of(Sheet).call(b). That looks horrifying, I know. I don''t > have IR available on this machine, or I would try it myself. Let me know how > that goes. This seems like it will be a fairly common problem for things > like LINQ, PFx and Rx. Maybe we can come up with a simple, one-size-fits-all > solution?yikes :) I was pretty sure something like that was involved. I think I''ll try the static version first, see if it works. thanks for the hint, I''ll keep you posted :) -- Thibaut> > > Ryan Riley > > Email: ryan.riley at panesofglass.org > LinkedIn: http://www.linkedin.com/in/ryanriley > Blog: http://wizardsofsmart.net/ > Website: http://panesofglass.org/ > > > On Fri, Nov 20, 2009 at 9:17 AM, Thibaut Barr?re < > thibaut.barrere at gmail.com> wrote: > >> Hi, >> >> I''m testing out the OpenXML SDK with IronRuby (0.9.2). Turns out it''s full >> of generics in there, a good play field. >> >> Here I''m trying to use the API to retrieve a list of sheets in an existing >> xslx. >> >> I''m having a hard-time understanding why I can''t call "b.first" in the >> next snippet (full version at http://gist.github.com/239555): >> >> doc = SpreadsheetDocument.open(''docs/single-cell.xlsx'', false) >> >> >> >> >> >> >> >> a = doc.workbook_part.workbook.method(:get_first_child).of(Sheets).call >> >> >> >> puts a >> >> >> >> # -> DocumentFormat.OpenXml.Spreadsheet.Sheets >> >> >> >> >> >> >> >> b = a.method(:elements).of(Sheet).call >> >> >> >> puts b >> >> >> >> # -> DocumentFormat.OpenXml.OpenXmlElementList+<OfType>d__0`1[DocumentFormat.OpenXml.Spreadsheet.Sheet] >> >> >> >> >> >> >> >> # b.first or anything similar fails >> >> >> >> * >> >> * >> >> It turns out that b.methods shows a "to_a" method is available, then I can >> do : >> >> puts b.to_a.first # woot! >> >> >> >> # -> DocumentFormat.OpenXml.Spreadsheet.Sheet >> >> >> >> >> So my questions are: >> - why can''t I call b.first ? (maybe there''s something obvious I didn''t see >> - I assume it''s probably that) >> - are there better ways of writing this ? >> >> And if you are interested to follow (I really need to wrap some ruby sugar >> around all this to make it easier to work with), I''ll push my experiments >> here: >> >> http://github.com/thbar/openxml-labs >> >> thanks, >> >> Thibaut >> -- >> http://www.learnivore.com >> >> _______________________________________________ >> Ironruby-core mailing list >> Ironruby-core at rubyforge.org >> http://rubyforge.org/mailman/listinfo/ironruby-core >> >> > > _______________________________________________ > Ironruby-core mailing list > Ironruby-core at rubyforge.org > http://rubyforge.org/mailman/listinfo/ironruby-core > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20091120/a82f035c/attachment-0001.html>