IronRuby is_a с DateTime
-
12-09-2019 - |
Вопрос
Кто -нибудь может объяснить, почему 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