IronRuby is_a с DateTime - PullRequest
       10

IronRuby is_a с DateTime

0 голосов
/ 03 декабря 2009

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

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

Ответы [ 2 ]

1 голос
/ 29 декабря 2009

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

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

1 голос
/ 03 декабря 2009

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

Я думаю, что здесь происходит то, что IronRuby рассматривает квадратные скобки как пустые индикаторы универсального типа (поскольку создание универсального типа выполняется с тем же синтаксисом, например, System :: Collections :: Generic :: Список [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
...