【问题标题】:Does Perl 6 have named tuples?Perl 6 有命名元组吗?
【发布时间】:2016-04-27 13:06:51
【问题描述】:

我知道 Swift 已经命名了元组:

let twostraws = (name: "twostraws", password: "fr0st1es")

所以我可以说:

print(twostraws.name)  # twostraws

但在 Perl 6 中我会说:

my $list = (twostraws, fr0st1es);
say $list[0];

哪个不如 Swift,所以我想知道 Perl 6 中是否有命名元组?

【问题讨论】:

  • 您在寻找 Hashmap 吗?
  • @zb226 my $name = "twostraws"; my $password = "fr0st1es"; my $list = (:name($name), :password($password)); say $list[0]{'name'}; 这是 HashMap 吗?
  • Pairs 的List。您可以通过执行例如查看类型say $list[0].WHAT;.

标签: raku


【解决方案1】:

有多种方法可以得到类似的东西。

  • 简单哈希(推荐)

    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 实际上,您可以用任何有人为之写过俚语的语言编写代码。 (所以实际上,所有其他语言都可以被认为是 Perl 6 的子集)如果你要编写很多语言,你可以为它编写一个 Circumfix 运算符sub circumfix:&lt;` `&gt; ( @ ($name,$password)) { %( :$name, :$password ) }; say ` 'twostraws', 'fr0st1es' `&lt;name&gt;
【解决方案2】:

枚举可以具有非 Int 的值类型。您将它们声明为 Pairs 列表。

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

【讨论】:

    【解决方案3】:

    看起来您在 Perl 6 中寻找的类型是哈希。

    查看相关文档:

    这是一个 Perl 6 示例,应该等同于您的 Swift 示例:

    my %twostraws = name => 'twostraws', password => 'fr0st1es';
    
    print %twostraws<name>; # twostraws
    

    【讨论】:

    【解决方案4】:

    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 的替代语法称为“冒号对”。您可以将多个 Pairs 一起收集到一个列表中,但它们只能按位置访问;

    > $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
    >
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多