История изменений
Исправление Lilly, (текущая версия) :
Всё равно выглядит неплохо, хотя меня от непривычки немного клинит, когда не видно сходу, где переменная, а где вызов. В Perl 6 если аргументов нет, то скобки и не нужны, что часто используется, особенно в методах. При этом если хочешь обратиться к блоку кода как к объекту первого класса, а не вызову, то просто добавляешь & к имени и готово. Это ситуация менее частая, чем вызовы, на мой взгляд.
Недавно рефакторил один кусок кода и дико повеселило, что вот такой код (имена изменены и упрощено, конечно) просто заработал:
class A {
has $.foo is rw;
}
my $a = A.new(foo => 'hello'.encode); # загоняем в атрибут foo UTF8 байты 'hello'
# кстати, `encode` это вызов, но скобки без надобности
$a.foo .= decode;
# теперь в атрибуте $.foo будет 'hello', decode это тоже метод
`$a.foo` это геттер, который возвращает нам значение, казалось бы, это l-value, но потом ты вызываешь на нём метод и оно просто записывается и просто работает. Более длинная версия выглядела бы так:
$a.foo = $a.foo.decode;
И понятно, что это звучит как «И зачем это сокращение?», но это если $a и foo, а если там $message.error-status, то это уже превращается в `$message.error-status = $message.error-status.decode`, что не так приятно.
Кстати, непонятно, почему иногда считается, что += это окей, а .= (вызов метода на объекте и присваивание результата) это уже как-то странно, суть-то в операции.
Исправление Lilly, :
Всё равно выглядит неплохо, хотя меня от непривычки немного клинит, когда не видно сходу, где переменная, а где вызов. В Perl 6 если аргументов нет, то скобки и не нужны, что часто используется, особенно в методах. При этом если хочешь обратиться к блоку кода как к объекту первого класса, а не вызову, то просто добавляешь & к имени и готово. Это ситуация менее частая, чем вызовы, на мой взгляд.
Недавно рефакторил один кусок кода и дико повеселило, что вот такой код (имена изменены и упрощено, конечно) просто заработал:
class A {
has $.foo is rw;
}
my $a = A.new(foo => 'hello'.encode); # загоняем в атрибут foo UTF8 байты 'hello'
# кстати, `encode` это вызов, но скобки без надобности
$a.foo .= decode;
# теперь в атрибуте $.foo будет 'hello', decode это тоже метод
`$a.foo` это геттер, который возвращает нам значение, казалось бы, это l-value, но потом ты вызываешь на нём метод и оно просто записывается и просто работает. Более длинная версия выглядела бы так:
$a.foo = $a.foo.decode;
И понятно, что это звучит как «И зачем это сокращение?», но это если $a и foo, а если там $message.error-status, то это уже превращается в `$message.error-status = $message.error-status.decode`, что не так приятно.
Кстати, непонятно, почему иногда языках считается, что += это окей, а .= (вызов метода на объекте и присваивание результата) это уже как-то странно, суть-то в операции.
Исходная версия Lilly, :
Всё равно выглядит неплохо, хотя меня от непривычки немного клинит, когда не видно сходу, где переменная, а где вызов. В Perl 6 если аргументов нет, то скобки и не нужны, что часто используется, особенно в методах. При этом если хочешь обратиться к блоку кода как к объекту первого класса, а не вызову, то просто добавляешь & к имени и готово. Это ситуация менее частая, чем вызовы, на мой взгляд.
Недавно рефакторил один кусок кода и дико повеселило, что вот такой код (имена изменены и упрощено, конечно) просто заработал:
class Foo {
has $.foo is rw;
}
my $a = A.new(foo => 'hello'.encode); # загоняем в атрибут foo UTF8 байты 'hello'
# кстати, `encode` это вызов, но скобки без надобности
$a.foo .= decode;
# теперь в атрибуте $.foo будет 'hello', decode это тоже метод
`$a.foo` это геттер, который возвращает нам значение, казалось бы, это l-value, но потом ты вызываешь на нём метод и оно просто записывается и просто работает. Более длинная версия выглядела бы так:
$a.foo = $a.foo.decode;
И понятно, что это звучит как «И зачем это сокращение?», но это если $a и foo, а если там $message.error-status, то это уже превращается в `$message.error-status = $message.error-status.decode`, что не так приятно.
Кстати, непонятно, почему иногда языках считается, что += это окей, а .= (вызов метода на объекте и присваивание результата) это уже как-то странно, суть-то в операции.