混合布尔元素的语法

jjm*_*elo 5 perl6

如果我尝试使用布尔组件声明Mix:

my $mix= (True => 0.3, False => 0.7).Mix;
dd $mix; # OUTPUT: «Mix $mix = ("True"=>0.3,"False"=>0.7).Mix?»
Run Code Online (Sandbox Code Playgroud)

他们使用Pair语法,自动引用那些裸标识符.为了避免这种情况,您必须通过Pair.new显式定义Pairs,否则使用完全限定名称.

my $mix= (Bool::True => 0.3, Bool::False => 0.7).Mix;
Run Code Online (Sandbox Code Playgroud)

还有其他办法吗?也许更简单的方法?

Bra*_*ert 7

你可以使用任何不被视为赤字的东西.

完全合格的名字有效.

Bool::True => 1
Run Code Online (Sandbox Code Playgroud)

他们工作的原因是他们没有的话语::.
所以你也可以前置::.

::True => 1
Run Code Online (Sandbox Code Playgroud)

您可以使用 ::(…)

::(True) => 1

::('True') => 1
::< True > => 1
Run Code Online (Sandbox Code Playgroud)

您也可以使用()各地True.

(True) => 1
Run Code Online (Sandbox Code Playgroud)

你可以向后声明并使用它 .antipair

( 1 => True ).antipair

( :foo ).antipair # (Bool::True) => 'foo'
Run Code Online (Sandbox Code Playgroud)

如果您不介意获得可以使用的序列.invert,或者.antipairs

# Seq.new( Bool::True => 1 )
( 1 => True ).invert 
( 1 => True ).antipairs

# Seq.new( Bool::True => 1, Bool::False => 2 )
( 1 => True, 2 => False ).invert
( 1 => True, 2 => False ).antipairs
Run Code Online (Sandbox Code Playgroud)

如果True是子程序而不是术语,则可以追加()

sub True ( --> True ){}

True() => 1
Run Code Online (Sandbox Code Playgroud)

然后有使用Pair.new.

Pair.new( True, 1 )
Run Code Online (Sandbox Code Playgroud)


Chr*_*oph 5

使用parens作为in (True) => 0.3或null伪包::True => 0.3将是另一种选择.