IronRuby is_a con DateTime
-
12-09-2019 - |
Domanda
Qualcuno può spiegare perché DateTime in IronRuby è Object [] codice di esempio
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
Soluzione
Utilizzando []
per i tipi generici è una sintassi giustificabile per Ruby, ma il comportamento corrente che si vede (utilizzando []
su un tipo non generico) è un bug aperto: http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3355
In Ruby, parentesi quadre sono utilizzate solo per indicizzazione in una matrice, non definisce un tipo-array ... in quanto non v'è alcuna necessità per definire il tipo di una matrice rubino. Rubino permette di sovraccaricare qualsiasi []
mezzo contro qualsiasi oggetto, e l'oggetto Class
di Ruby non ha un significato per []
, quindi abbiamo definito []
a significare ottenere un tipo generico. Tenete a mente che il metodo of
è il metodo preferito da usare; []
è davvero lì solo per convenienza e la sintassi simile con IronPython.
Altri suggerimenti
A causa System :: Object [] non è davvero un tipo di matrice. t.is_a? (System :: DateTime []) restituirà true pure.
Credo che ciò che accade qui, è che IronRuby considera le parentesi quadre come indicatori di tipo generico vuote (perché la creazione di un tipo generico è fatto con lo stesso sintassi, per esempio, System :: Collections :: generica :: List [String] .new ).
Il modo giusto per farlo è la seguente:
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