我正在使用MixHash将两个Hashes与Bag add(+)运算符组合在一起.这似乎有效 - 但是...我有点惊讶的是,工会的结果需要重新强制回到MixHash.
我的猜测是Bag add(+)infix操作符首先将所有内容强制转换为Bag并将结果作为Bag返回.这对我来说可能有风险,因为我的一些重量是负的(因此首先是混合).这会正确地增加负重吗?
或者,是否有Mix add(+)运算符?
my MixHash $dim-mix;
for ... {
my $add-mix = $!dims.MixHash;
$dim-mix = $dim-mix ?? ( $dim-mix (+) $add-mix ).MixHash !! $add-mix;
}
dd $dim-mix;
Run Code Online (Sandbox Code Playgroud)
现在我看一下这个释义代码,或许有一些三元的表述?!既然已经在左边了,可以避免在测试中拼出$ dim-mix?
非常感谢任何建议!
my $add-mix = (foo => 0.22, bar => -0.1).Mix;
my $dim-mix;
for ^5 {
$dim-mix (+)= $add-mix;
}
dd $dim-mix; # Mix $dim-mix = ("foo"=>1.1,"bar"=>-0.5).Mix
Run Code Online (Sandbox Code Playgroud)
显然我没有使用过MixHash,但如果你需要在循环之后你可以解决这个问题.
(当然你可能会想"但不是Mix不可变的?"它是 - 但你必须区分变量和值.$dim-mix是一个变量,一个Scalar变量.即使你输入它 - my Mix $dim-mix;它仍然是一个Scalar 变量持有一个变量Mix 值.你总是可以分配给Scalar.)
我开始习惯这样的问题,我不知道发生了什么,但我想我应该能够解决这个问题.这是我的过程:
我让你的代码运行,看看它做了什么.我试图简化三元组.嗯.
我转向医生.有一个doc页面(+).这叫它"Baggy addition".鉴于Bag只存在(正)整数,这令人担忧.
我转向了源头.我开始搜索rakudo"Baggy addition"的来源.一个结果.我专注于多重(Mixy:D $a, QuantHash:D $b)签名.这告诉我结果应该保留Mixy,即医生的意思是它或将要去的Baggy是一个红鲱鱼.
我回到代码中,开始想知道我能做些什么.当我最初尝试使用(+)=简化主要赋值时,编译器抱怨expected MixHash but got Mix.我尝试了半打事情没有工作,那么只是改变了MixHash约束上$dim-mix,以Mixy和它的工作.
然后我仔细考虑了发生了什么,并意识到几乎所有类型都阻碍了P6做正确的事情.
如果确实需要,可以添加一些类型.
(但你真的需要它们吗?当类型是绝对必要的时候它们很棒.否则,imo,三思而后,然后两次,然后再介绍它们.它们很容易使代码更难阅读,推理,编写和更慢.)
(当然,在某些情况下,它们并不是绝对必要的,但确实对整体有帮助.Imo,就像所有事情一样,一开始就保持简单,只有当你看到特定代码行的明显好处时才会复杂化.)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |