- 1
- 2
- 3
- 4
- 5
- 6
n = 0
for i in range(n):
pass
print i
NameError: name 'i' is not defined
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−146
n = 0
for i in range(n):
pass
print i
NameError: name 'i' is not defined
inkanus-gray 25.06.2015 18:37 # 0
3_14dar 25.06.2015 19:22 # −1
Тут i будет равным 0
inkanus-gray 25.06.2015 19:42 # 0
Значит, придётся думать в рамках концепции foreach.
dxd 25.06.2015 20:25 # 0
3_14dar 25.06.2015 20:26 # −2
guest 25.06.2015 23:53 # 0
3_14dar 26.06.2015 03:47 # −1
dxd 26.06.2015 05:46 # 0
3_14dar 26.06.2015 05:48 # −1
guest 25.06.2015 23:53 # +1
3_14dar 26.06.2015 03:48 # −2
guest 26.06.2015 04:32 # +1
3_14dar 26.06.2015 05:26 # −3
guest 26.06.2015 05:28 # 0
3_14dar 26.06.2015 05:49 # −2
guest 26.06.2015 18:25 # 0
1) падать с треском?
2) добавлять undefined?
3) автоматически инициализиовать None
?
Vasiliy 26.06.2015 18:29 # 0
3_14dar 26.06.2015 19:03 # −2
guest 26.06.2015 19:06 # 0
Но смех в том, что если ты _читаешь_ переменную, и такая переменная есть в верхнем скопе, то ты обращаешься к ней. А если пишешь -- то создаешь новую переменную, если только не указал global.
Так что скопы есть, просто они немного необычны
3_14dar 26.06.2015 19:06 # −2
guest 26.06.2015 19:10 # 0
3_14dar 26.06.2015 19:43 # −2
guest 26.06.2015 19:43 # 0
3_14dar 26.06.2015 19:45 # −2
guest 26.06.2015 19:49 # +1
Единственный из языков с фигурной скобочкой который так делает. Нежданчик (один из немногих) для сишников, джавистов, пхпистов итд.
Vasiliy 26.06.2015 19:50 # +1
3_14dar 26.06.2015 19:55 # −2
Vasiliy 26.06.2015 19:56 # 0
ну и
$переменная;
3_14dar 26.06.2015 20:33 # −2
>$переменная
3_14dar 26.06.2015 19:54 # 0
Vasiliy 26.06.2015 19:46 # +2
inkanus-gray 26.06.2015 19:56 # +2
Fike 26.06.2015 20:33 # +2
3_14dar 26.06.2015 21:57 # −4
Fike 26.06.2015 22:11 # +4
3_14dar 26.06.2015 22:23 # −1
Stertor 26.06.2015 22:24 # 0
3_14dar 26.06.2015 22:29 # −3
Fike 26.06.2015 23:05 # 0
3_14dar 26.06.2015 23:06 # −3
Fike 26.06.2015 23:09 # 0
3_14dar 26.06.2015 23:18 # −4
Fike 26.06.2015 23:19 # 0
guest 26.06.2015 18:24 # +1
Vindicar 27.06.2015 00:16 # 0
отработает
3_14dar 27.06.2015 00:39 # 0
Vindicar 27.06.2015 12:32 # 0
inkanus-gray 27.06.2015 13:31 # 0
3_14dar 27.06.2015 18:42 # −1
inkanus-gray 27.06.2015 20:47 # 0
1. В языках со словом var по умолчанию всё наследуется, а var указывает на локальную видимость.
2. В языках без слова var по умолчанию ничего не видно, поэтому нужно явно указать, что передавать (nonlocal в Питоне, use в PHP).
Ответ на вопрос, какая из концепций «более правильная», оставим любителям холиваров.
Говно ваш "ЭКМАскрипт", переходите на "PHP".
3_14dar 27.06.2015 20:57 # −2
1024-- 27.06.2015 23:58 # 0
3_14dar 28.06.2015 00:29 # −2
Fike 28.06.2015 05:04 # +1
3_14dar 28.06.2015 06:39 # −2
Fike 28.06.2015 06:59 # +1
1024-- 28.06.2015 12:12 # +2
3_14dar 28.06.2015 19:54 # −1
roman-kashitsyn 28.06.2015 21:03 # +3
kegdan 28.06.2015 22:29 # 0
3_14dar 28.06.2015 23:49 # −1
kegdan 28.06.2015 23:59 # +1
3_14dar 29.06.2015 00:00 # −1
kegdan 29.06.2015 00:01 # +1
3_14dar 29.06.2015 00:02 # −1
kegdan 29.06.2015 00:04 # +2
Объекты есть, а классов нет. Не завезли
inkanus-gray 29.06.2015 00:27 # +1
Объявить новый тип данных/класс в JS нельзя.
google: классы в javascript
Найдёшь целое поле, засеянное костылями и велосипедами.
P.S. Домашнее задание: написать, как в JS будет выглядеть аналог наследования.
kegdan 29.06.2015 01:07 # +1
3_14dar 29.06.2015 01:25 # −1
1024-- 29.06.2015 05:01 # 0
1024-- 29.06.2015 05:42 # 0
> Если же тебе нужны ещё экземпляры того же класса, ты просто клонируешь однажды созданный объект столько раз, сколько экземпляров нужно.
Так можно. А если через new? Как минимум, методы будут присобачены к другому объекту (прототипу) и не скопируются. А поля, определённые в конструкторе скопированы не будут, а создадутся заново вместе с новым экземпляром.
Но и с какой точки зрения? В коде объявление будет выглядеть как класс, при использовании new будет выглядеть как единовременное создание, да и оптимизация в v8, кажется, собирала все поля из конструктора в единую структуру.
> Объявить новый тип данных/класс в JS нельзя.
Но почему? Есть же специальные конструкции вроде function...prototype для определения классов, new для создания экземпляров, а также instanceof для проверки принадлежности к классу. Всё сделано для того, чтобы определить класс и создавать его объекты.
Если же в жс нельзя объявить новый тип/класс, то и в жабе нельзя, поскольку любой тип пользователя там будет просто модифицированным Object, а ключевое слово class - просто для отвода глаз.
1024-- 29.06.2015 06:03 # 0
Насколько я помню, в хаскеле можно только конструировать, в крестах - преобразовывать и инициализировать в списке инициализации и творить чушь в теле конструктора, в жс - только творить чушь в теле конструктора.
Но, насколько я помню, Майерс показывал, что в крестах уместнее использовать список инициализации, а не творить чушь.
А в жс конструктор без побочных эффектов - высшее благо:
Здесь за счёт того, что конструктор Downloader только инициализирует данные, а не вызывает для удобства метод download, удалось (1) без побочных эффектов создать объект-прототип класса-наследника (2) без побочных эффектов инициализировать поля класса-родителя для каждого объекта класса-наследника, чтобы они не стали статическими для класса-наследника (3) найти простой масштабируемый механизм наследования:
Выходит, надо упрощать конструкторы до инициализации?
3_14dar 29.06.2015 06:05 # 0
1024-- 29.06.2015 06:07 # +1
3_14dar 29.06.2015 06:15 # 0
3_14dar 29.06.2015 06:33 # −1
dxd 29.06.2015 15:22 # 0
kegdan 29.06.2015 15:25 # −1
3_14dar 29.06.2015 21:28 # −1
kegdan 29.06.2015 06:21 # 0
Конструктор должен возвращать экземпляр типа. Если левую питушню можно навесить на левую функцию - навесь. Не усложняй конструктор свой.
1024-- 29.06.2015 06:28 # 0
http://ideone.com/kFZ1qx
А ведь, кажется, в споре одновозвратники упоминали простоту логирования. Но, "нагрешив" императивно в конструкторе и деструкторе, получаем милоту.
roman-kashitsyn 29.06.2015 09:47 # +2
В хаски для нетривиальной инициализации есть идиома smart constructor. А родные конструкторы нужны в основном для сопоставления с образцом.
В большинстве остальных языков конструкторы (включая жабу) - не более чем обычная функция, вызываемая в нужный момент. Кмк, там их можно безболезненно выпилить, как сделали в Go и прочих оберонах.
inkanus-gray 27.06.2015 00:46 # 0
В каком Питоне должно пройти?
bormand 27.06.2015 07:17 # +2
inkanus-gray 27.06.2015 13:30 # 0
Я забыл, каким словом захватывается родительский контекст...
3_14dar 27.06.2015 18:41 # −1
3_14dar 07.07.2015 20:30 # −1