我知道,雨燕命名元组:Perl 6有命名元组吗?
let twostraws = (name: "twostraws", password: "fr0st1es")
,所以我可以说:
print(twostraws.name) # twostraws
但在Perl 6我说:
my $list = (twostraws, fr0st1es);
say $list[0];
这是不一样真棒作为Swift,所以我想知道在Perl 6中是否有命名的元组?
我知道,雨燕命名元组:Perl 6有命名元组吗?
let twostraws = (name: "twostraws", password: "fr0st1es")
,所以我可以说:
print(twostraws.name) # twostraws
但在Perl 6我说:
my $list = (twostraws, fr0st1es);
say $list[0];
这是不一样真棒作为Swift,所以我想知道在Perl 6中是否有命名的元组?
有越来越类似的各种方式。
简单散列(推荐)
my \twostraws = %('name' => 'twostraws', 'password' => 'fr0st1es');
print twostraws<name>; # twostraws{ qw'name' }
列表两种方法在
my \twostraws = ('twostraws', 'fr0st1es') but role {
method name () { self[0] }
method password() { self[1] }
}
put twostraws.name; # `put` is like `print` except it adds a newline
匿名类
my \twostraws = class :: {
has ($.name, $.password)
}.new(:name('twostraws'), :password('fr0st1es'))
say twostraws.name; # `say` is like `put` but calls the `.gist` method
可能有相当多的多,我没有考虑过的。真正的问题是如何在代码的其余部分使用它。
哇,Perl 6非常灵活! – chenyf
@chenyf其实你可以用任何语言写你的代码,有人写了一个俚语。 (所以实际上,所有其他语言都可以被认为是Perl 6的一个子集)如果你打算写很多它们,你可以为它编写一个Circumfix运算符:sub circumfix:<\' \'>(@($ name,$ password)) {%(:$ name,:$ password)};说\''twostraws','fr0st1es'\'
看起来像Perl 6中的类型,你正在寻找的是一个散列。
请参阅相关的文档:
这里是一个Perl 6的例子,应该是相当于你斯威夫特例如:
my %twostraws = name => 'twostraws', password => 'fr0st1es';
print %twostraws<name>; # twostraws
一些补充文档:[语法:“字符串文字”](https://doc.perl6.org/language/syntax#String_literals)(单引号与Perl 6中的双引号)。 –
的perl6相当于Pair类型及其构造函数运算符是=>。它们是不可变的 - 一旦创建了钥匙和价值就不能改变;
$ perl6
> my $destination = "Name" => "Sydney" ;
Name => Sydney
> say $destination.WHAT ;
(Pair)
> $destination.value = "London";
Cannot modify an immutable Str
in block <unit> at <unknown file> line 1
>
像perl5的“胖逗号”,如果它是一个单一的标识符的构造不需要左侧被引用。有一种表达称为“冒号对”的对的替代语法。你可以收集一系列的pairs togeather到列表中,但它们只能被定位到;
> $destination = (Name => "Sydney" , :Direction("East") , :Miles(420));
(Name => Sydney Direction => East Miles => 420)
> say $destination.WHAT ;
(List)
> say $destination[1] ;
Direction => East
>
有结肠对语法的方便变种 - 如果该值是一个字符串,你可以替换尖括号,括号并删除引号。如果该值为整数,则可以在之后立即列出键的值,而不包含引号。如果该值为布尔值,则如果该值为True,则可以单独列出该键,如果该值为False,则可以使用!
作为前缀。
最后,您可以将它们中的一些分配到一个散列,其中的值可以通过键访问并且是可变的;
> my %destination = (:Name<Sydney> , :Direction<East> , :420miles , :!visited) ;
Direction => East, Name => Sydney, miles => 420, visited => False
> say %destination<miles> ;
420
> %destination<visited> = True ;
True
>
枚举可以具有非Int的值类型。您将它们声明为对的列表。
enum Twostraws (name => "twostraws", password => "fr0st1es");
say name; # OUTPUT«twostraws»
say password; # OUTPUT«fr0st1es»
say name ~~ Twostraws, password ~~ Twostraws; # OUTPUT«TrueTrue»
say name.key, ' ', name.value; # OUTPUT«name twostraws»
即宣告与enum
的类型可用于就像任何其他类型。
sub picky(Twostraws $p){ dd $p };
picky(password); # OUTPUT«Twostraws::password»
编辑:看https://github.com/perl6/roast/blob/master/S12-enums/non-int.t
你在寻找一个HashMap吗? – zb226
@ zb226 'my $ name =“twostraws”; my $ password =“fr0st1es”; my $ list =(:name($ name),:password($ password)); say $ list [0] {'name'};' 是这个** HashMap **? – chenyf
它是[Pair](https://doc.perl6.org/type/Pair)s的[List](https://doc.perl6.org/type/List)。您可以通过执行'说$ list [0] .WHAT;'。 – zb226