autobox - 組み込み型をファーストクラスオブジェクトとして利用
autobox - use builtin datatypes as first-class objects

目次 TABLE OF CONTENTS


名前 NAME

autobox - 組み込み型をファーストクラスオブジェクトとして利用 autobox - use builtin datatypes as first-class objects


概要 SYNOPSIS

    use autobox;

    # call methods on builtin values and literals
    # 組み込みの値やリテラルからメソッド呼び出し

    # integers
    # 整数

	my $range = 10->to(1); # [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]

    # floats
    # 浮動小数点数

	my $error = 3.1415927->minus(22/7)->abs();

    # strings
    # 文字列

	my $uri = 'www.%s.com/foo.pl?arg=%s'->f($domain, $arg->escape());
	my $links = 'autobox'->google();

	my $word = 'rubicund';
	my $definition = $word->lookup_on_dictionary_dot_com();

	my $greeting = "Hello, World"->upper(); # "HELLO, WORLD"

	$greeting->to_lower(); # greeting is now "hello, world"
	$greeting->for_each(\&character_handler);

    # ARRAY refs
    # 配列リファレンス

	my $schwartzian = [ @_ ]->map(...)->sort(...)->map(...);
	my $sd = [ 1, 8, 3, 3, 2, 9 ]->standard_deviation();

    # HASH refs
    # ハッシュリファレンス

	{ alpha => 'beta', gamma => 'vlissides' }->for_each(...);

    # CODE refs
    # CODE リファレンス

	my $plus_five = (\&add)->curry()->(5);
	my $minus_three = sub { $_[0] - $_[1] }->reverse->curry->(3);

    # can() and isa() work as expected
    # can(), 及び isa() は想定通りに動作します

	if ("Hello, World"->can('foo')) ...
	if (3.1415927->isa('SCALAR')) ...

説明 DESCRIPTION

autobox プラグマは Perl の組み込み型にファーストクラスオブジェクト としての能力を賦与します. これは ARRAY, HASH, CODE リファレンスや 生のスカラーからブレスされたリファレンスと全く同じようにメソッドを 呼べることを許可します. autoboxは透過的に行われます: autoboxされた 値は(ユーザが定義した)実装クラスにブレスされることはありません( メソッドがブレスのようななにかを与えることを選ぶことなしに) - それにもかかわらず単純にそのメソッドを利用します. The autobox pragma endows Perl's core datatypes with the capabilities of first-class objects. This allows methods to be called on ARRAY refs, HASH refs, CODE refs and raw scalars in exactly the same manner as blessed references. The autoboxing is transparent: boxed values are not blessed into their (user-defined) implementation class (unless the method elects to bestow such a blessing) - they simply use its methods as though they are.

autobox はレキシカルスコープにあり, 外部のスコープのハンドラ(後述)は 内側のスコープで上書き又は取り消すことができます. autobox is lexically scoped, and handlers (see below) for an outer scope can be overridden or countermanded in a nested scope:

    {
	use autobox; # default handlers
	...
	{
	    use autobox SCALAR => 'MyScalar';
	    ...
	}
	# back to the default
	...
    }

autobox化は no 構文を使うことで完全に解除できます: Autoboxing can be turned off entirely by using the no syntax:

    {
	use autobox;
	...
	no autobox;
	...
    }

- undef を単独でデフォルトの値に指定しても同様です(後述): - as well as by specifying a sole default value of undef (see below):

    use autobox DEFAULT => undef;

autobox化は裸の単語(bareword)には影響しません, すなわち, Autoboxing is not performed for barewords i.e.

    my $foo = Foo->new();

及び: and:

    my $foo = new Foo;

は思った通りに振る舞います. behave as expected.

加えて, 名前付きのメソッドのみを対象とします, つまりこれは動作しますが: In addition, it only covers named methods, so while this works:

    my $foobar = { foo => 'bar' }->some_method();

これは動作しません: These don't:

    my $method1 = 'some_method';
    my $method2 = \&HASH::some_method;

    my $error1 = { foo => 'bar' }->$method1();
    my $error2 = { foo => 'bar' }->$method2();

コアタイプがbox化されるクラスは完全に設定可能です. デフォルトでは オブジェクトではない値から呼び出されるメソッドは, その値の ref() と対応するパッケージ名か, リファレンスでなければ 'SCALAR' です. The classes into which the core types are boxed are fully configurable. By default, a method invoked on a non-object value is assumed to be defined in a package whose name corresponds to the ref() type of that value - or 'SCALAR' if the value is a non-reference.

すなわち標準的な: Thus a vanilla:

    use autobox;

は以下のデフォルトハンドラを(現在のレキシカルスコープに対して) 登録します: registers the following default handlers (for the current lexical scope):

    {
	SCALAR	=> 'SCALAR',
	ARRAY	=> 'ARRAY',
	HASH	=> 'HASH',
	CODE	=> 'CODE'
    }

これにより: Consequently:

    "hello, world"->upper()

は以下の呼び出しとなります: would be invoked as:

    SCALAR::upper("hello, world")

さらに: while:

    [ 1 .. 10 ]->for_each(sub { ... })

は以下となります: resolves to:

    ARRAY::for_each([ 1 .. 10 ], sub { ... })

組み込み型からユーザ定義クラスへのマッピングは use autobox 文へキー/値バインディングのリストを渡すことで 指定できます. A mapping from the builtin type to the user-defined class can be specified by passing a list of key/value bindings to the use autobox statement.

以下の例では有効な引数の範囲を示します: The following example shows the range of valid arguments:

    use autobox SCALAR  => 'MyScalar'	    # package name
		ARRAY   => 'MyNamespace::', # package prefix (ending in '::')
		HASH    => '',		    # use the default i.e. HASH 
		CODE    => undef,	    # don't autobox this type
		UNDEF   => ...,		    # can take any of the 4 types above
		DEFAULT => ...,		    # can take any of the 4 types above
		DEBUG   => ...;		    # boolean or coderef

SCALAR, ARRAY, HASH, CODE, UNDEF そして DEFAULT は4種類の値を取ることが 出来ます: SCALAR, ARRAY, HASH, CODE, UNDEF and DEFAULT can take four different types of value:

これまでに述べた SCALAR, ARRAY, HASH, CODE そして DEFAULT の オプションに加えて2つのオプション, UNDEF 及び REPORT があります. In addition to the SCALAR, ARRAY, HASH, CODE and DEFAULT options above, there are two additional options: UNDEF and DEBUG.

UNDEF

仮想型, UNDEF, は未定義値の autobox に利用されます. これはデフォルトでは autobox されません (すなわちデフォルトは undef です): The pseudotype, UNDEF, can be used to autobox undefined values. These are not autoboxed by default (i.e. the default value is undef):

これは動作しません: This doesn't work:

    use autobox;

    undef->foo() # runtime error

これなら動作します: This works:

    use autobox UNDEF => 'MyPackage'; 

    undef->foo(); # ok

そしてこれも動作します: So does this:

    use autobox UNDEF => 'MyNamespace::'; 

    undef->foo(); # ok

DEBUG

DEBUG は現在のハンドラをコールバック若しくは静的なレポート関数 で露出させます. DEBUG exposes the current handlers by means of a callback, or a static debugging function.

これは手書きで算出された束縛を見たい人には便利です. This can be useful if one wishes to see the computed bindings in 'longhand'.

デバッグは DEBUG キーに対応する値が偽であれば無視されます. Debugging is ignored if the value corresponding to the DEBUG key is false.

値が CODE リファレンスであればその関数が現在のスコープに対して 算出されたハンドラを含んだハッシュへのリファレンスを伴って 呼び出されます. If the value is a CODE ref, then this sub is called with a reference to the HASH containing the computed handlers for the current scope.

そして最後に, DEBUG が真で且つ CODE リファレンスでなければ, ハンドラは 標準エラーにダンプされます. Finally, if DEBUG is true but not a CODE ref, the handlers are dumped to STDERR.

すなわち: Thus:

    use autobox DEBUG => 1, ...

若しくは or

    use autobox DEBUG => sub { ... }, ...

若しくは or

    sub my_callback ($) {
	my $hashref = shift;
	...
    }

    use autobox DEBUG => \&my_callback, ...

警告 CAVEATS

Perl の優先順位のために幾つかの autobox リテラルは括弧でくくる 必要があります: Due to Perl's precedence rules some autoboxed literals may need to be parenthesized:

例えばこれは動作しますが: For instance, while this works:

    my $curried = sub { ... }->curry();

これは動作しません: this doesn't:

    my $curried = \&foo->curry();

リファレンスを括弧でくくることで解決出来ます: The solution is to wrap the reference in parentheses:

    my $curried = (\&foo)->curry();

符号付きの整数及び浮動小数点数リテラルにも同様に適用できます: The same applies for signed integer and float literals:

    # this works
    # これは動作します
    my $range = 10->to(1);

    # this doesn't work
    # これは動作しません
    my $range = -10->to(10);

    # this works
    # これは動作します
    my $range = (-10)->to(10);

Perl の print BLOCK 構文(perlsub参照)に関する特殊なケースでは print { expression() } ... (ここで波括弧は無名ハッシュ リファレンスを意味します)において幾つかの曖昧性の除去のために 幾分踏み込む必要があります. Perl's special-casing for the print BLOCK ... syntax (see perlsub) means that print { expression() } ... (where the curly brackets denote an anonymous HASH ref) may require some further disambiguation:

    # this works (
    # これは動作します(
    print { foo => 'bar' }->foo();

    # and this
    # そしてこれも
    print { 'foo', 'bar' }->foo();

    # and even this
    # これもまた
    print { 'foo', 'bar', @_ }->foo();

    # but this doesn't
    # でもこれはだめです
    print { @_ }->foo() ? 1 : 0

後者のケースでは, これを解決するために print() の最初の引数に HASH リファレンス以外の何かを渡す必要があります: In the latter case, the solution is to supply something other than a HASH ref literal as the first argument to print():

    # e.g.
    # 例
    print STDOUT { @_ }->foo() ? 1 : 0;

    # or
    # 若しくは
    my $hashref = { @_ };
    print $hashref->foo() ? 1 : 0; 

    # or
    # 若しくは
    print '', { @_ }->foo() ? 1 : 0; 

    # or
    # 若しくは
    print '' . { @_ }->foo() ? 1 : 0; 

    # or even
    # さらに若しくは
    { @_ }->print_if_foo(1, 0);

can 及び isa は autobox された値では"上書き(overload)"されて いますが, VERSION メソッドはされていません. つまり, これらは動作しますが: Although can and isa are "overloaded" for autoboxed values, the VERSION method isn't. Thus, while these work:

	[ ... ]->can('pop')

	3.1415->isa('MyScalar')

これは動作しません: This doesn't:

	use MyScalar 1.23;

	use autobox SCALAR => MyScalar;

	print "Hello, World"->VERSION(), $/;

けれどももちろん: Though, of course:

	print MyScalar->VERSION(), $/;

及び and

	print $MyScalar::VERSION, $/;

は従来通りに動作します. continue to work.

これは perl の use 及び no の実装による制限です. 同じように import 及び unimport は autobox プラグマからは影響を受けません. This is due to a limitation in perl's implementation of use and no. Likewise, import and unimport are unaffected by the autobox pragma:

	'Foo'->import() # equivalent to Foo->import() rather than MyScalar->import('Foo')
	                # MyScalar->import('Foo') ではなくFoo->import() と等価

	[]->import()  # error: Can't call method "import" on unblessed reference
	              # エラー: ブレスされていないリファレンス上で "import" メソッドを呼び出せません

バージョン VERSION

1.10


関連項目 SEE ALSO

* Moose::Autobox
* autobox::Core
* Perl6::Contexts
* Shell::Autobox
* Scalar::Properties
* Set::Array

著者 AUTHOR

chocolateboy: <chocolate.boy@email.com>


著作権 COPYRIGHT

Copyright (c) 2005, chocolateboy.

このモジュールはフリーソフトウェアです. Perl と同じライセンスの 元で利用, 再配布及び変更を行うことが出来ます. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.


和訳 TRANSALTE TO JAPANESE

 山科 氷魚 (YAMASHINA Hio) <hio@hio.jp>

原典: autobox VERSION 1.10. 翻訳日: 2006-11-25. Origlnal distribution is autobox VERSION 1.10. Translated at 2006-11-25.

autobox - 組み込み型をファーストクラスオブジェクトとして利用
autobox - use builtin datatypes as first-class objects

索引 INDEX

autobox - 組み込み型をファーストクラスオブジェクトとして利用
autobox - use builtin datatypes as first-class objects