String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
my %hash is default(222)=(a=>0,b=>111);
sub test {say %_.default}; #using automatic parameter
test |%hash; #outputs (Any)
Скольжение по определению означает превращение контейнера в список его элементов. То есть вы передаете не хеш, а его содержимое.
%_
собирает экземпляров переданных именованных аргументов. Это локальный хеш для блока, в котором он не имеет отношения к хешу, используемому для вставки аргументов. Его стандартным значением по умолчанию является значение по умолчанию, равное Any
, точно так же, как и с объявленным my
хешем:
my %foo;
say %foo.default; # (Any)
Существует ли метод передачи значения по умолчанию хэша при вставке в дополнительный вызов?
blockquote>Вы можете сделать это:
my %hash is default(222)=(a=>0,b=>111); sub test {say %_<hash-default>} test |%hash, :hash-default(%hash.default); #outputs 222