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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top