2016-04-27 56 views
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中是否有命名的元组?

+0

你在寻找一个HashMap吗? – zb226

+0

@ zb226 'my $ name =“twostraws”; my $ password =“fr0st1es”; my $ list =(:name($ name),:password($ password)); say $ list [0] {'name'};' 是这个** HashMap **? – chenyf

+0

它是[Pair](https://doc.perl6.org/type/Pair)s的[List](https://doc.perl6.org/type/List)。您可以通过执行'说$ list [0] .WHAT;'。 – zb226

回答

10

有越来越类似的各种方式。

  • 简单散列(推荐)

    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 
    
0123混合
  • 匿名类

    my \twostraws = class :: { 
        has ($.name, $.password) 
    }.new(:name('twostraws'), :password('fr0st1es')) 
    
    say twostraws.name; # `say` is like `put` but calls the `.gist` method 
    

可能有相当多的多,我没有考虑过的。真正的问题是如何在代码的其余部分使用它。

+0

哇,Perl 6非常灵活! – chenyf

+0

@chenyf其实你可以用任何语言写你的代码,有人写了一个俚语。 (所以实际上,所有其他语言都可以被认为是Perl 6的一个子集)如果你打算写很多它们,你可以为它编写一个Circumfix运算符:sub circumfix:<\' \'>(@($ name,$ password)) {%(:$ name,:$ password)};说\''twostraws','fr0st1es'\'' –

4

看起来像Perl 6中的类型,你正在寻找的是一个散列。

请参阅相关的文档:

这里是一个Perl 6的例子,应该是相当于你斯威夫特例如:

my %twostraws = name => 'twostraws', password => 'fr0st1es'; 

print %twostraws<name>; # twostraws 
+0

一些补充文档:[语法:“字符串文字”](https://doc.perl6.org/language/syntax#String_literals)(单引号与Perl 6中的双引号)。 –

3

的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 
> 
5

枚举可以具有非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