2017-01-02 14 views
3

宣言されたものに.WHYを呼び出すと、その周囲に構築された特別なコメントが返されます。それはいいね。クラスで定義されたサブルーチンをどのように参照できますか?それは常に隠されていますか?私は、クラスの代わりにサブルーチンを提供するモジュールについて興味があります(その答えは "そうしないでください")。私はほとんど.WHYの限界とそれを取ることができる範囲で遊んでいます。ここでPerl 6のクラスのサブルーチンで.WHYを呼び出すにはどうすればよいですか?

#| This is the outside bit 
sub outside { 137 } 
put &outside.WHY; # This works 

#| Class Foo is an example 
class Foo { 
    #| The bar method returns a number 
    method bar { 137 } 

    #| quux is a submethod 
    submethod quux { 137 } 

    #| qux is private 
    submethod !qux { 137 } 

    #| The baz method also returns a number 
    sub baz { 37 } 

    put &baz.WHY; # this works in this scope 
    } 

put "---- With an object"; 
quietly { 
    my $object = Foo.new; 
    put "As object: ", $object.WHY; 

    # sub is not really a method? 
    put "As object - bar: ", $object.^find_method('bar').WHY; 

    # should this work? It *is* private after all 
    put "As object - qux: ", $object.^find_method('qux').WHY; 
    } 

put "---- With class name"; 
quietly { 
    put Foo.WHY; 
    put "As class lookup: ", ::("Foo").WHY; 
    put "As class lookup (quux): " ~ Foo.^lookup('quux').WHY; 
    put "As class lookup (baz): " ~ Foo.^lookup('baz').WHY; # nope! 

    # this is the part where I need help 
    put "As :: lookup: ", ::("Foo")::("&baz").WHY; #nope 
    } 

は出力です:

This is the outside bit 
The baz method also returns a number 
---- With an object 
As object: Class Foo is an example 
As object - bar: The bar method returns a number 
As object - qux: 
---- With class name 
Class Foo is an example 
As class lookup: Class Foo is an example 
As class lookup (quux): quux is a submethod 
As class lookup (baz): 
As :: lookup: 

それは私が求めている出力の最後の行です。クラス内で定義されたサブルーチンにはどうすれば到達できますか?

答えて

2

これは仕事でちょうどレキシカルスコープです:あなたが外からそれらを取得したい場合、あなたはourを追加(またはいくつかの他の方法でそれらを手動で公開する必要がありますので、my

潜水デフォルト - として私が知っている限りでは、MOPやその他のメタプログラミング機能(疑似パッケージMY::など)を利用する方法はありません。

私の代わりにis exportが何のためにあるのかのクラス

のサブルーチンを提供するモジュールについて興味があります。

3
 # should this work? It *is* private after all 
    put "As object - qux: ", $object.^find_method('qux').WHY;

次の仕事の両方:

put "As object - qux: ", $object.^find_private_method('qux').WHY; 
put "As object - qux: ", $object.^private_method_table<qux>.WHY; 

find_private_methodはp6docに記載されていないようですので、私はそれが公式のAPIであるかどうかわからないんだけどprivate_method_tableが文書化されています、。実際に説明していないが。)


 
    # this is the part where I need help 
    put "As :: lookup: ", ::("Foo")::("&baz").WHY; #nope

sub baz { 37 }our sub baz { 37 }と宣言すると、これが機能します。
あなたはまた、単により多くのルックアップを書くことができる:それは外部からアクセスできるように、(Synopsis 3, section "Declarators"で説明)our宣言子、この場合に現在のパッケージ–、クラス–のシンボルを関連付ける

put "As :: lookup: ", &Foo::baz.WHY; 

それは::の構文を使用しています。

デフォルトでは、サブルーチンのスコープは–です。つまり、デフォルトの宣言子が指定されていない場合はmyです。 (文のsub baz { 37 }は、基本的に中括弧で区切られた範囲の先頭にmy &baz := sub { 37 }を書くのと同じ効果があります。)
our sub baz { 37 }を書き込むことによって、あなたはour代わりのmyスコープを使用するように指示しています。


私は(代わりに、クラス

のサブルーチンを提供するモジュールについて興味のどちらか上に示したようourでそれを宣言するユーザスコープは完全修飾を使用する必要があります。その場合には名前Foo::bazを入力するか、ユーザスコープにエクスポートします(その場合は、bazと表示されます)。問題のモジュールに

module Foo { 
    #| The baz method also returns a number 
    sub baz is export(:ALL) { 37 } 
} 

import Foo :ALL; 

say &baz.WHY;

use文が暗黙的に呼び出されますimport

シンボルがエクスポートさせるための最も簡単な方法は、is export形質を使用することです。ここではモジュールは同じファイルに定義されているので、importを直接呼び出すことができます。クラスはuse「Dまたはimport」EDである時はいつでもシンボルはデフォルトでインポートされるであろう場合には、あなたも(:ALLなし)sub baz is export { 37 }を書くことができます

注意、。しかし、Perl 5/CPANコミュニティでは悪い習慣とみなされ、ユーザーに個々のシンボルをインポートさせることが推奨されています。 Perl 6では、個々のシンボルのインポートがまだ機能していないので、今は:ALLタグを使用することをお勧めします。


1)私の知る唯一の違いは、最初のケースでルーチンはイントロスペクションの目的のために独自の名前を知っていることです。

関連する問題