Я подозреваю, что на этот вопрос очень легко ответить, а ответ - нет. Однако я хочу убедиться, что ничего не упускаю.
Рассмотрим следующий код:
sub f(:$a = 'foo') { say $a }
sub g(:$a) { f :$a }
g(); # OUTPUT: «(Any)»
Есть ли хороший способ изменить подпись / тело &f
или &g
так, чтобы это печатало foo
вместо Any
?
Я знаю два способа заставить &f
использовать значение по умолчанию для $a
, но ни один из них не подходит.
Опция 1:
sub f(:$a = 'foo') { say $a }
multi g(:$a) { f :$a }
multi g() { f }
g(); # OUTPUT: «foo»
Вариант 2:
sub f(:$a = 'foo') { say $a }
sub g(:$a) { f |(:$a with $a) }
g(); # OUTPUT: «foo»
Ни один из этих подходов не кажется отличным, поэтому я надеюсь, что кто-нибудь сможет показать мне более элегантный подход, которого мне не хватает. С другой стороны, оба они работают, так что, конечно, не будет большой проблемой, если это будет просто немного неэлегантный угол (и очень маленький).
(Any)
- person ugexe   schedule 10.03.2021Cannot unbox a type object (Any) to a str.
- person raiph   schedule 10.03.2021sub g(:$a) { f |(:$a with $a) }
очень удобочитаемым. Ниже я обнаружил, что недооцениваю, когда читаюg a => "bar"; g;
. Без обид, @ElizabethMattijsen! - person jubilatious1   schedule 10.03.2021$_
,|(:$a if $a.defined)
не стал бы :-) - person Elizabeth Mattijsen   schedule 10.03.2021