Странное поведение Boolean
Почему не работает
Код AS3:
Код AS3:
|
Лучше всегда избегать неявного преобразования типов по разным соображениям. (Качество и безопасность кода, скорость выполнения.)
|
"+" — более сложный генерик, допускающий разнообразие типов, например при сложении строк. Умножение строк допустимо? )))
|
Цитата:
Добавлено через 36 секунд Да и к тому же получается на 12 как если бы мы складывали строки, а число 3. |
Код:
Почему тогда в джаве не работает? в CLisp-e (+ t 2) +: T is not a number, ( * t 2) : T is not a numbe в python True * 2 == 2, True + 2 == 3 в js true * 2 == 2 и true + 2 == 3 Erlang 3> true + 2. ** exception error: an error occurred when evaluating an arithmetic expression in operator +/2 called as true + 2 4> true * 2. ** exception error: an error occurred when evaluating an arithmetic expression in operator */2 called as true * 2 в haxe - не скомпилирует c++11 true * 2 == 2, true + 2 == 3 c# - не скомпилируется rust - не скомпилируется UPD Код:
Bash |
Цитата:
|
Цитата:
ЗЫ Зачем работая с as3 вы сравниваете что-то с другими языками, когда вы с ними в данный момент не работаете? почитайте про приведение типов в ас3, посмотрите на оператор +, подумайте, все встанет на свои места |
СлаваRa, ну что вы в загадки то играете. Лучше объясните по какой логике разработчики языка разрешили неявное приведение булева типа к числу для сложения, но не разрешили для умножения. Уверен можно уложиться в одно предложение.
|
оператор + перегружен(на уровне VM), как минимум, для конкатенации строк, скорее всего(уверен в этом на 146%), приведение типа срабатывает в зависимости от каких-то условий, т.е. при использовании + для конкатенации? происходит преобразование в строку, если один из операндов строка, видимо при использовании операции сложения bool и int первый из-за автокаста преобразуется в ближайшее подходящее, т.е. в int(1), оператор * используется только для умножения числовых типов и не имеет иных предназначений, поэтому никаких преобразований операндов не происходит.
|
Код AS3:
Цитата:
|
причем тут Java, какое она имеет отношение к AS3?
|
СлаваRa, это всё понятно, но мне кажется такое поведение языка непоследовательным. Надо было разрешить неявное приведение булева типа к числу и в других операциях.
|
В приведение типов про оператор + ничего не сказано, чтобы позволяло ему складывать логические переменные.
Добавлено через 42 секунды Цитата:
Добавлено через 3 минуты Могли бы в других операторах разрешить приведение типов, а не только в +. Добавлено через 10 минут Тем более оператором +, нельзя выполнить математическое сложение числа и строки с числом, всегда будет строка. Добавлено через 13 минут Код AS3:
|
Цитата:
Цитата:
Не вижу ни одной ситуации, где это бы пригодилось. Возможно не хватает перегрузки операторов, например, чтобы упростить сложение векторов. Но умножать булево на число - занятие совершенно бессмысленное. Если уж это для чего-то потребовалось, ты всегда можешь сделать явное приведение типов и без проблем произвести операцию |
Мне кажет, что каша в голове по поводу "странного поведения Boolean" возникла из-за двойственного предназначении оператора +, а именно:
+ addition Складывает числовые выражения. Если оба выражения являются целыми числами, их сумма также будет выражена целым числом; если одно из выражений или оба выражения являются числами с плавающей запятой, их сумма также будет выражена числом с плавающей запятой. Если одно выражение является строкой, все другие выражения преобразуются в строки и сцепляются, а не суммируются. В противном случае, если выражение не является числом, проигрыватель Flash® Player преобразует его в число. + concatenation Сцепляет (объединяет) строки. Если одно выражение является строкой, все другие выражения преобразуются в строки и сцепляются. Если оба выражения являются числами, данный оператор выполняет функцию оператора сложения. Компилятор распознаёт, что вы имели ввиду в своём выражении. А теперь посмотрим, что будет, если приведение логики будет с другими операторами: 123/false = 123/0 – деление на ноль; true * "one" – умножение строк. А это как? Ну и дальше в том же духе. |
Цитата:
Код AS3:
|
Код AS3:
|
Цитата:
|
Цитата:
|
Код AS3:
|
Цитата:
|
d = c ? a + b : a;
Читается как "d равно если с, то a плюс b, иначе а" d = a + int(c)*b; Читается как "d равно a плюс результат приведения с к инту умноженный на b" И где теряется читаемость? |
Цитата:
Например гораздо легче прочитать: Код AS3:
Код AS3:
Код AS3:
|
развейте ваш switch до 500 кейсов
|
Красивый пример умножения числа на булево:
Код AS3:
|
Часовой пояс GMT +4, время: 10:50. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.