2009-12-03 13 views
0

Quelqu'un peut-il expliquer pourquoi DateTime dans IronRuby est l'objet [] Code exempleIronRuby is_a avec DateTime

IronRuby 0.9.1.0 on .NET 2.0.50727.4927 
Copyright (c) Microsoft Corporation. All rights reserved. 

>>> require 'System' 
=> true 
>>> t = System::DateTime.Now 
=> Thu Dec 03 15:32:42 +05:00 2009 
>>> t.is_a?(Time) 
=> true 
>>> t.is_a?(System::DateTime) 
=> true 
>>> t.is_a?(System::Object) 
=> true 
>>> t.is_a?(System::Object[]) 
=> true 
>>> t.is_a?(System::Decimal) 
=> false 

Répondre

1

L'utilisation [] pour les types génériques est une syntaxe justifiable pour Ruby, mais le comportement actuel que vous voyez (en utilisant [] sur un type non générique) est un bug ouvert: http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3355

En Ruby, les crochets sont utilisés uniquement pour l'indexation dans un tableau, définit pas un type tableau ... car il n'y a pas besoin de définir le type d'un tableau Ruby. Ruby permet de surcharger tout ce qui [] signifie contre tout objet, et l'objet Class de Ruby n'a pas de signification pour [], donc nous avons défini [] pour signifier obtenir un type générique. Gardez à l'esprit que la méthode of est la méthode préférée à utiliser; [] est vraiment seulement là pour la commodité et la syntaxe similaire avec IronPython.

1

Parce que System :: Object [] est pas vraiment un type de tableau. t.is_a? (System :: DateTime []) retournera vrai également.

Je pense que ce qui se passe ici, c'est que IronRuby considère les crochets comme des indicateurs de type génériques vides (parce que créer un type générique est fait avec la même syntaxe, par exemple, System :: Collections :: Generic :: List [Chaîne] .new).

La bonne façon de le faire est la suivante:

IronRuby 0.9.3.0 on .NET 2.0.50727.4927 
Copyright (c) Microsoft Corporation. All rights reserved. 

>>> t = System::DateTime.new 
=> 01/01/0001 00:00:00 
>>> t.is_a? System::Array.of(System::Object) 
=> false 
+0

c'est un très étrange, crochet carré toujours utilisé par la syntaxe tableau de ruby. Pourquoi mélanger? En tout cas merci beaucoup. –