Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Generics в Boo.

241
09 ноября 2009 года
Sanila_san
1.6K / / 07.06.2005
Начал недавно играться с Boo. В процессе знакомства в консоли #develop наткнулся на ошибку в учебнике:
[highlight=python]print([0, 'alpha', 4.5, char('d')])
print List('abcdefghij')
l = List(range(5))
print l[/highlight]

Третья строка вызывает ошибку:
 
Код:
ERROR: Generic types without all generic parameters defined cannot be instantiated.
Решение нашлось такое:
 
Код:
l = List[of int](range(5))


Отсюда вопрос знающим: какой оптимальный вариант задавать тип элементов списка неявно?
5
09 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Sanila_san
Отсюда вопрос знающим: какой оптимальный вариант задавать тип элементов списка неявно?


Я пользуюсь простым правилом: указываю типы тогда, когда компилятор сам затрудняется их вывести.
Касательно примера - похоже в Boo есть проблемы (ограничения) с макросом range(), раз booc не может выполнить его типизацию.

241
09 ноября 2009 года
Sanila_san
1.6K / / 07.06.2005
Да, видимо проблема и правда есть. Ну, я для общего вида нашёл такой способ:
Код:
>>> CommonList = List[of object]()
[]
>>> CommonList.Add('a', 2, 3.1415926, 'boo', range(5)) //так делать низя
------------------^
ERROR: The best overload for the method 'System.Collections.Generic.List.Add(object)' is not compatible with the argument list '(string, int, double, string, System.Collections.Generic.IEnumerable)'.

>>> CommonList.Add('a')
>>> CommonList.Add(2)
>>> CommonList.Add(3.1415926)
>>> CommonList.Add('boo')
>>> CommonList.Add(range(5))
>>> CommonList
['a', 2, 3,1415926, 'boo', Boo.Lang.Builtins+<range>d__e]
>>>
Последнее применение метода Add намекает на то, что макрос в таком виде не выполняется. Это можно починить конструкцией вроде этой:
 
Код:
for item in range(5):
    CommonList.Add(item)
Странно только, что в первоисточнике то ли неточность, то ли ошибка.
87
09 ноября 2009 года
Kogrom
2.7K / / 02.02.2008
Boo не знаю, вопрос не понял, но тему поддержать хочу :)

 
Код:
five = [i for i in range(5)]
print five

CommonList = []
CommonList += ['a', 2, 3.1415926, 'boo', five]
print CommonList

CommonList += five
print CommonList
241
09 ноября 2009 года
Sanila_san
1.6K / / 07.06.2005
Не всё так просто:

 
Код:
>>> CommonList += ['a', 2, 3.1415926, 'boo']
---------------^
ERROR: Operator '+' cannot be used with a left hand side of type 'System.Collections.Generic.List' and a right hand side of type 'Boo.Lang.List'.

Попахивает нуждой в тайпкасте?
5
09 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Sanila_san
Не всё так просто:

 
Код:
>>> CommonList += ['a', 2, 3.1415926, 'boo']
---------------^
ERROR: Operator '+' cannot be used with a left hand side of type 'System.Collections.Generic.List' and a right hand side of type 'Boo.Lang.List'.
Попахивает нуждой в тайпкасте?

Да тут похоже шизофрения со списками....

87
09 ноября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Sanila_san
Не всё так просто:

 
Код:
>>> CommonList += ['a', 2, 3.1415926, 'boo']
---------------^
ERROR: Operator '+' cannot be used with a left hand side of type 'System.Collections.Generic.List' and a right hand side of type 'Boo.Lang.List'.



Свой код запускал в режиме интерпретатора. Работает. Версия Boo 0.9.1.3287. Код компилируется и тоже запускается. Не знаю что за #develop - всё ручками запускал, напрямую обращаясь к booi.exe, и booc.exe.

241
10 ноября 2009 года
Sanila_san
1.6K / / 07.06.2005
#develop - это IDE. :) Что интересно: специально скачал с сайта standalone-архив Boo, версия booc та же самая (2.0.9.2), а прикол в том, что в booish работает код, не работающий в #develop:
Код:
//booish
   nmeamsg = List [of object]()
[]
>>>nmeamsg += "GPRMC",123519,"A",4807.038,"N",01131.000,"E",022.4,084.4,230394,003.1,"W*6A"
['GPRMC', 123519, 'A', 4807,038, 'N', 1131, 'E', 22,4, 84,4, 230394, 3,1, 'W*6A']

//#develop
>>>  nmeamsg = List [of object]()
[]
>>> nmeamsg += "GPRMC",123519,"A",4807.038,"N",01131.000,"E",022.4,084.4,230394,003.1,"W*6A"
------------^
ERROR: Operator '+' cannot be used with a left hand side of type 'System.Collections.Generic.List' and a right hand side of type '(object)'.
Компилятор вроде бы один и тот же.

Первоисточник говорит, что списки можно объявлять двумя способами:
[QUOTE="http://boo.codehaus.org/Part+05+-+Containers+and+Casting"]Lists can be defined two ways:
1. by using brackets []
2. by creating a new List wrapping an IEnumerator, or an array.[/QUOTE]

И что характерно, в #develop первый вариант вполне прокатил:
 
Код:
>> lst = []
[]
>>> lst += "GPRMC",123519,"A",4807.038,"N",01131.000,"E",022.4,084.4,230394,003.1,"W*6A"
['GPRMC', 123519, 'A', 4807,038, 'N', 1131, 'E', 22,4, 84,4, 230394, 3,1, 'W*6A']
>>>
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог