加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

签名 – 只有当它表示整数时,如何将Str转换为Int?

发布时间:2020-12-15 21:55:03 所属栏目:大数据 来源:网络整理
导读:在Perl 6中,您可以指定可以强制类型的类型.如果你需要一个Int,但得到一些可以转换为Int的东西.当您不希望Int和Str的单独候选项(字符串表示整数值)时,这很方便. 但是,转换似乎有点激进,因为转换不仅改变了类型,而且愿意改变数据.这部分是改变类型的混淆和将数
在Perl 6中,您可以指定可以强制类型的类型.如果你需要一个Int,但得到一些可以转换为Int的东西.当您不希望Int和Str的单独候选项(字符串表示整数值)时,这很方便.

但是,转换似乎有点激进,因为转换不仅改变了类型,而且愿意改变数据.这部分是改变类型的混淆和将数字截断为整数的预期操作的问题.从概念上讲,这些是不同的想法,但它们在Str.Int中交织在一起(实际上是将一次旅行夹在Numeric中):

sub foo ( Int:D() $n ) { put "Got <$n> of type {$n.^name}" }
foo( 80 );     # Got <80> of type Int
foo( '99' );   # Got <99> of type Int
foo( 1.5 );    # Got <1> of type Int
foo( '1.5' );  # Got <1> of type Int

试图将此限制为Str并不是更好:

sub foo ( Int:D(Str:D) $n ) { put "Got <$n> of type {$n.^name}" }
foo( '1.5' );  # Got <1> of type Int

我可以制作一些似乎最容易理解的适配器:

multi foo ( Int:D $n ) {
    put "Got <$n> of type {$n.^name}"
    }
multi foo ( Str:D $n where { $^n.Int == $^n.Numeric } ) {
    foo( $n.Int );
    }

foo( '1.5' );  # Cannot resolve ...

我可能会想出一些子集,但这并不令人满意.所以诀窍是,我可以在不改变价值的情况下强制这样做(即使它改变了表示)吗?

事实证明,此功能已损坏,并且没有修复时间表:RT 132980.基本上,不强制执行目标类型.文档已更新.我的建议是根本不使用它.

解决方法

Int:D(Any)在Rakudo中的工作方式是创建一个接受Any的多候选者,将其转换为Int,并使用结果调用原始子例程.

如果您自己这样做,您可以更好地控制它的工作方式.

proto sub foo ( Int:D() $n ) {*}

multi sub foo ( Any:D $n ) {
  my $i = try $n.Numeric.narrow;

  if $i ~~ Int:D {

    samewith $i

  } else {

    X::TypeCheck::Binding::Parameter.new(

      # there are more arguments that should be added here
      got => $n,expected => Int:D(),).throw

  }
}

multi sub foo ( Int:D $n ) { put "Got <$n> of type {$n.^name}" }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读