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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

796閲覧

ramda.js applySpec

退会済みユーザー

退会済みユーザー

総合スコア0

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/02/13 06:48

js

1const getMetrics = R.applySpec({ 2 sum: R.add, 3 nested: { mul: R.multiply } 4}); 5getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }

ramda.jsのapplySpecについて、非常に情けないのですが、公式ドキュメントを読んでも理解できませんでした。

https://ramdajs.com/docs/#applySpec

コードを読もうとしてもイメージが湧かないです...。
まず

applySpecによって返されるものは関数で、さらに上のように、他の関数をネスト構造で組み込めるのでしょうか。
つまり、

applySpecは関数のセットを作って返すものというイメージでよろしいでしょうか。

そして"applySpecによって作られた関数に付与された引数"は、"内部のそれぞれの関数"に付与されるということでしょうか。

Try Ramdaでは以下のようなコードも動きました...。

js

1const getMetrics = R.applySpec({ 2 sum: R.add, 3 nested: { mul: R.multiply }, 4 test : (x , y) => { return y - x } 5}); 6getMetrics(2, 4); // => {"nested": {"mul": 8}, "sum": 6, "test": 2}

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

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

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

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

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

guest

回答1

0

ベストアンサー

applySpecによって返されるものは関数

これは間違いありませんね。
値のお尻に()を入れて実行出来るのは関数(もしくはプロパティに保存されたメソッド)だけです。

他の関数をネスト構造で組み込めるのでしょうか。

本文にobject recursively mapping properties to functionsという記述があるので、
オブジェクトのネストにも対応しているそうです。

applySpecは関数のセットを作って返すものというイメージでよろしいでしょうか。

これの目的はspacという名前が付いているように、
バリデートやテストコードがメインでしょうね。

例えばフォームの値をチェックしましょうとなった時、
必須入力項目が3つあるとするじゃないですか、
しかし、普通にtrue or falseを返すだけでは、どの入力項目が空なのかが判別出来ないので個別にあり/なしを検証する必要があり、オブジェクト形式でキーの値がfalseのものを見つけたら入力失敗だったとしたい。
そんな場面で力を発揮しそうです。

えっ、だったら最初からこれでええやんだって!?知らんがな
まぁ、こういうのと比べると、各関数を外部ファイル化したり別スコープから輸入出来るって所で強みがあるかもしれませんね。

JavaScript

1const getMetrics = (x, y) => ({ 2 sum: x + y, 3 nested: { mul: x * y }, 4 test : y - x 5}); 6getMetrics(2, 4);

"applySpecによって作られた関数に付与された引数"は、"内部のそれぞれの関数"に付与されるということでしょうか。

ここはまぁそんな感じですね。
意地悪で引数1個しか取らないid: R.identityを追加したところ、
結果は1個目の引数の2になりました。

このことから、オブジェクト内の全てのキーが所持している関数に対して
同じ引数をそのまま使って実行し、機械的に戻り値に変換しているようです。

JavaScript

1const getMetrics = R.applySpec({ 2 sum: R.add, 3 nested: { mul: R.multiply }, 4 id: R.identity 5}); 6getMetrics(2, 4); 7// {"id": 2, "nested": {"mul": 8}, "sum": 6}

投稿2019/02/13 07:16

編集2019/02/13 07:26
miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2019/02/13 07:24

R.identityでの検証も含め、非常に詳しくありがとうございました。 イメージが少しずつ湧いてきました...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問