Рассмотрим такой код (это просто пример не настоящий код):
class Foo(url : String) extends Bar(url)
{
def say() { println(url) }
}
Он компилируется и работает.С глупыми результатами "конечно".Я слишком новичок, чтобы судить, но для меня это не имеет смысла, кроме путаницы - по определению невозможно, чтобы аргумент конструктора был доступен непосредственно другим способом.
Может ли кто-то иметь больше опыта в Scala?указать условие, когда оно может работать или иметь смысл?Или подтвердите мое подозрение, что это недостаток в текущем компиляторе Scala.
Обновление
class Bar(val Url : String)
{
}
Почему "ерунда".Потому что моя воля (без «var» и «val» в Foo) состояла в том, чтобы просто передать аргумент, ничего больше.Поэтому, когда я на самом деле использую аргумент конструктора, это просто вопрос того, какую сущность я использую по ошибке .Когда вы пишете специально, вы каждый раз выигрываете джекпот, но если вы этого не сделаете (то есть допустили ошибку в написании), вы используете объекты случайным образом.Это не код не имеет смысла, это вычисление просто не имеет смысла, я мог бы также бросить кости.Существует область действия метода, и я не вижу причины, по которой не должно быть области видимости конструктора.
Обновление - обходной путь
Так что, похоже, эта злая конструкция действительночасть языка (по замыслу).Как предположили UserUnknown и Tomasz Nurkiewicz, единственной линией защиты от глупой опечатки является условность, однако нижний регистр не годится.«А» и «а» сильно различаются, но «U» и «и» не сильно.Введение одного специального символа (как показал Томаш) намного лучше, потому что можно визуально обнаружить подозрительное использование аргумента конструктора.
Я буду использовать «$» для «только что передаваемых» аргументов конструктора, это сложнеевведите для меня, и вы не видите этот символ слишком часто в коде.
Спасибо за ответы!
Почему это зло?Поскольку неявные действия должны быть разрешены явно пользователями - хорошие примеры являются «динамическими» в C #, неявные преобразования в Scala.И примеры нарушения этого правила, которое привело к множеству проблем: неявные преобразования в bool в C ++, неявные конструкторы в C ++, объявление с использованием в Perl.И этот конкретный случай очень, очень близок к упомянутому перлизму, в Perl наконец-то произошли изменения в интерпретаторе, чтобы обнаружить такие злоупотребления, почему Scala повторил ту же ошибку?Интересно.