読者です 読者をやめる 読者になる 読者になる

タプルと複数の値を返す関数inPHP

 少し前になりますけど、PHP勉強会 SIDE-Bので坂本さんの「Erlang 入門」でタプルについての話が出てきました。
 実はPythonにもタプルはあり、私が発表したGoogleAPPEngineでも引数に使われていましたので、すこし気になって調べてみました。

 Wikipediaそのものズバリ「プログラミング言語Pythonにおけるタプル」というものがあったのですが、それによると

Pythonにおけるタプルとは、いくつかの値 (数値型、文字列型など)をひとつにまとめて、あたかもひとつの値のように扱う機能である。カッコで複数の値をまとめるという見た目が似ているのでよくリストや配列と混同されるが、タプルは目的が異なっており、リストや配列が同質の (同じ型をもつ) オブジェクトをまとめるのに対し、タプルは用途や型が異なるオブジェクトをひとつにまとめるために使われる。

 だそうです。
 手元のwin版Python 2.5.2で試してみますと

test=['a',1]#ok
test2=[1,'a']#error


 確かに、異なった型を一つの配列に入れることはできないようです。ただし、一番目のケースのように最初に文字型を入れると、他はキャストされて文字列になるみたいです。

Erlangでも、たぶん同じではないかなと思います。

(追記)

 再試験してみたら両者とも動作しました。あれ?(汗)
 古いPythonのベースの記述なんでしょうか? 

def func(a):
     (c,d)=a
     return c

func((1,2))#1

一応こういう書き方はできるので、まあ使えれば便利といえば便利なんですが。普通に辞書(ハッシュ)にしておいた方が、順番間違えて変な動作をする可能性が減るんですけどね。
 


 この点、PHPの配列にはどんな型でも入れられますから、どうしてもタプルとかはなじみがないんでしょうね。

複数の値を返す関数

 Wikipediaによると、タプルの使い方の一つとして、複数の値を返す関数を作ることができるそうです。
 

 def func():
   return ('A', 1)
 
 (p,q) = func()  

 これならば、PHPでも似たようなことが出来ますね。

<?php 
function func(){
  return array('A', 1)
}
 list($p,$q) = func();  
?>

 これはうまく使えば

<?php 

list($p,$q) = $obj->method();
if($p->ok){

   $p->next();
}
if($q->ok){

   $q->next();
}  
?>

 みたいな感じで、複雑な処理がシンプルに書ける可能性がありますね。