Perl 6中__init__的等效方法是什么?

时间:2018-03-28 15:38:00

标签: python perl6 raku

在Python中,__init__用于初始化类:

class Auth(object):
    def __init__(self, oauth_consumer, oauth_token=None, callback=None):
        self.oauth_consumer = oauth_consumer
        self.oauth_token = oauth_token or {}
        self.callback = callback or 'http://localhost:8080/callback'

    def HMAC_SHA1():
        pass

Perl 6中 init 的等效方法是什么?方法new

3 个答案:

答案 0 :(得分:10)

Christopher Bottoms和Brad Gilbert的答案是正确的。但是,我想指出一些可能更容易理解Python和Perl6之间等价的事情。 首先,this page about going from Python to Perl6已满,包括this section on classes and objects

请注意,Perl6中的__init__相当于...... nothing 。构造函数是从实例变量自动生成的,包括默认值。但是,调用构造函数只需要Python中类的名称,而在Perl 6中使用new

另一方面,there are many different ways of overriding that default behavior,从定义您自己的new到使用BUILD, BUILDALL or, even better, TWEAK(通常定义为submethods,因此不会被子类继承)。< / p>

最后,你有self在Perl 6方法中引用对象本身。但是,我们通常会以这种方式看到它(如上例所示)self.instance-variable$!instance-variable(请注意-可以有效地成为Perl 6中标识符的一部分。)< / p>

答案 1 :(得分:9)

要迂腐,最接近的句法等价物是创建submethod BUILD(或TWEAK)。

这是最接近的翻译:

class Auth {
    has $.oauth_consumer;
    has $.oauth_token;
    has $.callback;

    submethod BUILD ( \oauth_consumer, \oauth_token=Nil, \callback=Nil ) {
        $!oauth_consumer = oauth_consumer;
        $!oauth_token = oauth_token // {};
        $!callback = callback // 'http://localhost:8080/callback';
    }

    method HMAC_SHA1 ( --> 'pass' ) {}
}

这是一个更惯用的

class Auth {
    has $.oauth_consumer;
    has $.oauth_token;
    has $.callback;

    submethod BUILD (
        $!oauth_consumer,
        $!oauth_token = {},
        $!callback = 'http://localhost:8080/callback',
    ) {
        # empty submethod
    }

    method HMAC_SHA1 ( --> 'pass' ) {}
}

真实地说我会写出克里斯托弗所做的事。

答案 2 :(得分:8)

在Perl 6中,每个类都有默认的new构造函数,可用于初始化对象的属性:

class Auth {
    has $.oauth_consumer is required;
    has $.oauth_token = {} ;
    has $.callback = 'http://localhost:8080/callback';

    method HMAC_SHA1() { say 'pass' }
}

my $auth = Auth.new( oauth_consumer => 'foo');

say "Calling method HMAC_SHA1:";

$auth.HMAC_SHA1;

say "Data dump of object $auth:";

dd $auth;

提供以下输出:

Calling method HMAC_SHA1:
pass
Data dump of object Auth<53461832>:
Auth $auth = Auth.new(oauth_consumer => "foo", oauth_token => ${}, callback => "http://localhost:8080/callback")

我建议您查看Class and Object tutorialObject Orientation上的页面(后一页包含HåkonHægland在您的问题评论中提到的Object Construction section)。