does Mixy
Mix 是一个不可变的集合,其中包含没有特定顺序的不同元素,每个元素都分配了一个实数权重。(对于可变 mix,请参阅 MixHash。)
Mix 通常用于执行加权随机选择 - 请参阅 .roll。
任何类型的对象/值都可以作为 mix 元素。在 Mix 中,使用 === 运算符比较为正数的项目被视为相同的元素,具有组合权重。
my = (butter => 0.22, sugar => 0.1,flour => 0.275, sugar => 0.02).Mix;say .elems; # OUTPUT: «3»say .keys.sort; # OUTPUT: «butter flour sugar»say .pairs.sort; # OUTPUT: «"butter" => 0.22 "flour" => 0.275 "sugar" => 0.12»say .total; # OUTPUT: «0.615»
可以使用 { } 后缀运算符或 < > 后缀运算符将 Mix 视为对象哈希,对于文字字符串键,返回相应的数字权重,对于不是 mix 元素的键,返回 0
my = (butter => 0.22, sugar => 0.1,flour => 0.275, sugar => 0.02).Mix;say <butter>; # OUTPUT: «0.22»say <sugar>; # OUTPUT: «0.12»say <chocolate>; # OUTPUT: «0»
创建 Mix 对象§
可以使用 mix 子例程(或 Mix.new,它是其简写)来组合 Mix。任何位置参数(无论其类型如何)都成为 mix 的元素 - 对于每次出现参数,权重为 1
my = mix "a", "a", "b" => 0, 3.14, π, π; # The Pair is a single elementsay .keys.map: *.^name; # OUTPUT: «(Rat Pair Num Str)»say .pairs;# OUTPUT: «(3.14 => 1 (b => 0) => 1 3.141592653589793 => 2 a => 2)»
或者,可以对现有对象调用 .Mix 强制转换器(或其函数形式 Mix())以将其强制转换为 Mix。其语义取决于对象的类型和内容。通常,它在列表上下文中计算对象并创建一个 mix,其中结果项作为元素,但对于类似哈希的对象或 Pair 项,只有键成为 mix 的元素,而(累积)值成为关联的数字权重
my = ("a", "a", "b" => 0, "c" => 3.14).Mix;say .keys.map(); # OUTPUT: «((Str) (Str))»say .pairs; # OUTPUT: «(a => 2 c => 3.14)»
如上文中的 b,值为 0 的元素将从 Mix 中消除。
或者,由于 Mix 是 Associative,我们可以使用 % 符号来声明它们;在这种情况下,我们可以使用 is 来声明它们的类型
my is Mix = ("a", "a", "b" => 0, "c" => 3.14);say .^name; # OUTPUT: «Mix»say ; # OUTPUT: «Mix(a(2) c(3.14))»
从 6.d(2019.03 及更高版本)开始,还可以指定希望在 Mix 中允许的值类型。这可以在调用 .new 时完成
# only allow stringsmy = Mix[Str].new: <a b b c c c>;
或使用伪装语法
# only allow stringsmy is Mix[Str] = <a b b c c c>;say <b>; # OUTPUT: «2»say <d>; # OUTPUT: «0»# only allow whole numbersmy is Mix[Int] = <a b b c c c>;# Type check failed in binding; expected Int but got Str ("a")
运算符§
请参阅 具有集合语义的运算符,以获取适用于 Mix 等类型的“集合运算符”的完整列表。
示例
my = (sugar => ⅓, spice => ¼, all-things-nice => ¾);my = ( sugar => 1, spice => 2);say (<) ; # OUTPUT: «True»say (^) ; # OUTPUT: «Set(all-things-nice)»say (+) ; # OUTPUT: «Bag(spice(2) sugar)»# Unicode versions:say ⊂ ; # OUTPUT: «True»say ⊖ ; # OUTPUT: «Set(all-things-nice)»say ⊎ ; # OUTPUT: «Bag(spice(2) sugar)»
子 mix§
sub mix(* --> Mix)
从 @args 创建一个新的 Mix。
方法§
方法 Bag§
method Bag (--> Bag)
强制 Mix 转换为 Bag。权重会转换为 Int,这意味着如果任何权重为负或截断为零,则结果 Bag 中键的数量可能少于原始 Mix 中的数量。
方法 BagHash§
method BagHash (--> BagHash)
强制 Mix 转换为 BagHash。权重会转换为 Int,这意味着如果任何权重为负或截断为零,则结果 BagHash 中键的数量可能少于原始 Mix 中的数量。
方法 reverse§
注意:此方法从 Any 继承而来,但是,Mixes 没有固有顺序,你不应该相信它会返回一致的输出。
方法 total§
method total(Mix: --> Real)
返回所有权重的总和
say mix('a', 'b', 'c', 'a', 'a', 'd').total == 6; # OUTPUT: «True»say %(a => 5.6, b => 2.4).Mix.total == 8; # OUTPUT: «True»
关于顺序的说明§
与 Bag/Mix 套件 中的其他元素相同,顺序不能得到保证或保持一致,你不应该依赖于诸如上面 reverse 之类的返回始终相同结果的方法。
另请参阅§
类型图§
Mix 的类型关系