Generics в Boo.
учебнике:
[highlight=python]print([0, 'alpha', 4.5, char('d')])
print List('abcdefghij')
l = List(range(5))
print l[/highlight]
Третья строка вызывает ошибку:
Решение нашлось такое:
Отсюда вопрос знающим: какой оптимальный вариант задавать тип элементов списка неявно?
Начал недавно играться с 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))
Отсюда вопрос знающим: какой оптимальный вариант задавать тип элементов списка неявно?
Цитата: Sanila_san
Отсюда вопрос знающим: какой оптимальный вариант задавать тип элементов списка неявно?
Я пользуюсь простым правилом: указываю типы тогда, когда компилятор сам затрудняется их вывести.
Касательно примера - похоже в Boo есть проблемы (ограничения) с макросом range(), раз booc не может выполнить его типизацию.
Код:
>>> 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]
>>>
[]
>>> 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]
>>>
Код:
for item in range(5):
CommonList.Add(item)
CommonList.Add(item)
Код:
five = [i for i in range(5)]
print five
CommonList = []
CommonList += ['a', 2, 3.1415926, 'boo', five]
print CommonList
CommonList += five
print CommonList
print five
CommonList = []
CommonList += ['a', 2, 3.1415926, 'boo', five]
print CommonList
CommonList += five
print CommonList
Код:
>>> 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'.
---------------^
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'.
Попахивает нуждой в тайпкасте?
Цитата: 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'.
---------------^
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'.
Да тут похоже шизофрения со списками....
Цитата: 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'.
---------------^
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.
IDE. :) Что интересно: специально скачал с сайта standalone-архив Boo, версия booc та же самая (2.0.9.2), а прикол в том, что в booish работает код, не работающий в #develop:
Компилятор вроде бы один и тот же.
Первоисточник говорит, что списки можно объявлять двумя способами:
[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 первый вариант вполне прокатил:
#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)'.
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']
>>>
[]
>>> 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']
>>>