Вопрос

Кто -нибудь может объяснить, почему DateTime в Ironruby является объектом [] Пример кода

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
Это было полезно?

Решение

С использованием [] для универсальных типов — вполне оправданный синтаксис для Ruby, но текущее поведение, которое вы видите (при использовании [] для необщего типа) является открытой ошибкой: http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3355

В Ruby квадратные скобки используются только для индексирование в массив, а не определять массив типов...поскольку нет необходимости определять тип массива Ruby.Ruby позволяет перегружать что угодно [] означает против любого объекта, а Ruby Class объект не имеет значения для [], поэтому мы определили [] означает получение общего типа.Имейте в виду, что of метод — предпочтительный метод; [] на самом деле существует только для удобства и аналогичного синтаксиса с IronPython.

Другие советы

Потому что System::Object[] на самом деле не является типом массива. t.is_a?(System::DateTime[]) также вернет true.

Я думаю, что здесь происходит то, что IronRuby рассматривает квадратные скобки как пустые индикаторы универсального типа (поскольку создание универсального типа выполняется с тем же синтаксисом, например, System::Collections::Generic::List[String].new).

Правильный способ сделать это следующий:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top