質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

239閲覧

クロージャ内のphp組み込み関数powの引数渡しについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/12/19 13:16

無名関数内のpowへの引数渡しについて分かりません

初歩的なクロージャに関する例題なのですが、
まずはソースコードを見ていただいてほしいです。
解らないことの1つ目が、コード内の$vが省略?されてるのが分かりません。
powの引数指定の理屈が分かりません。
2つ目が、何故二度代入し、その値が第二引数で渡され次に第一引数を渡すのか。
分かりません。
ついでに3つ目が、このコードにおける参照渡しの意味が分かりません。
&があってもなくても使えるのでは?

クロージャが理解出来てるないのでしょうか?
powの引数の渡し方がわかってないのでしょうか?
最近ずっと$vのことばかり考えています。
はぁ……

該当のソースコード

$my_pow = function($times = 2) //powの第一引数はどこに行くの?渡したら$timesの初期値になる。 { return function ($v) use (&$times) //クロージャされてるのは分かります。 { return pow($v,$times); //べき乗$vの$times乗。 }; }; $cube = $my_pow(3); //何故ここでpowの第二引数が渡されるのか?$my_pow($v,$times)としないのか? echo $cube(3); //何故ここで第一引数が渡されるのか? ?>

試したこと

変数に値を入れたりして挙動を見てみました。
このコードが成り立つってことだけは分かりましたが……

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

$my_powには、「関数を返す関数」が代入されています。
これを、引数3で呼び出すと、

PHP

1function ($v) 2 { 3 return pow($v,3); 4 };

という関数がreturnされて、$cubeに代入されます。
これを引数3で呼び出すと、pow(3,3)returnされます。

参照渡しについては必須では無いと思います。

投稿2018/12/19 13:46

otn

総合スコア84576

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

クロージャというか「カリー化」で悩んでいるのだと思います。このキーワードで調べてください。

一応説明を試みます。
$cube

php

1function cube($v) { return pow($v, 3); }

です。
phpの実行途中に、powの第二引数を固定化した、上記のような関数のコードを動的に生成することを実現するために、$my_powという関数を生成する関数を作ったのです。
$my_powは関数を返す関数であり

php

1function my_pow($times) { 2 return function($v) use($times) { return pow($v, $times); } 3}

従って、$my_pow(3)が関数なので、下記と等価です。これは上記のcubeと同じ形をしています。

php

1function my_pow_3($v) { return pow ($v, 3);}

カリー化は2引数関数を2個の1引数関数にかえるので、$my_pow(3)(4)(この場合4の3乗)という捉え方をするのが正しいです。

ちなみに、引数の順番が逆転しているのは、○の△乗というのを考えたときに、先に固定したいほうを先に渡す必要があるからです。もし、何かの3乗をすることが作るプログラムで良くある計算ではなく、2進数を計算するために2のn乗を頻繁に計算する用途があるとしたら、

php

1$my_n_shinsu = function($v) { return function($times) use($v) { return pow($v, $times); } 2$binary = $my_n_shinsu(2); 3$_2_no_10_jou = $binary(10); 4$_2_no_14_jou = $binary(14);

という風に第一引数から渡すように設計しなおすことは可能です。

投稿2018/12/19 14:58

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/20 05:53

わかりやすい例題で頭が下がります。 カリー化ですか……初めて耳にします。 関数を返す関数を作ったとき、複数の引数を、連続した関数の返された順番で渡してるのですね……たぶん ちょっとまだ理解しきってない気がしますが、十分有用な情報を提供してくださったので感謝します。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問