こんにちは。JavaScriptとRubyとPythonが頭の中でごちゃごちゃになっているブログ主です。
JavaScriptとRubyとPythonの配列とキーバリューオブジェクトが頭の中でごちゃごちゃです。ググろうとしても、「あの、アスタリスクつける操作、なんだっけ」となり、やりたいことをググる以前に操作の名前をググる必要があり、その際記号だと検索に引っかかりづらいため、かなり時間を取られます。 そんな自分のために、配列とキーバリューオブジェクトの記号を使った展開や代入の操作をまとめました。
配列とキーバリューオブジェクトの各言語での呼び名
配列とキーバリューオブジェクトの各言語での呼び名です。 配列とは何か、キーバリューオブジェクトとは何かの定義はしないので、以下を見てなんとなく理解してください。
JavaScript | Ruby | Python | |
---|---|---|---|
配列 | 配列(Array) | 配列(Array) | リスト(list) |
キーバリュー | ハッシュ(Hash) | オブジェクト(Object) | 辞書(dictionary) |
環境
動作を確認したバージョンです。
- JavaScript: ES6 + Google chrome v78.0.3904.97
- Ruby: 2.6.5
- Python: 3.7.0
配列とキーバリューオブジェクトの各言語での記号を使用した展開や代入の名前とサンプルコード
配列とキーバリューオブジェクトの、各言語での記号を使用した展開や代入の名前とサンプルコードです。 サンプルコードは代表的な使用法に限りました。名前が分かれば細かい部分は検索が可能と思いますので。 各言語、細かい違いがありますので、使用の際には公式ページをご覧ください。名称に公式ページへのリンクが張ってあります。
配列の要素を一度に複数の変数に代入する
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | 分割代入 | 多重代入 | シーケンスのアンパック |
英語名 | Destructuring assignment |
Multiple assignment
Array Decomposition |
Sequence unpacking |
コード例 |
const arr = [1, 2] const [a, b] = arr // a=1, b=2 |
arr = [1, 2] a, b = arr # a=1, b=2 |
my_list = [1, 2] a, b = my_list # a=1, b=2 |
備考 |
キーバリューの要素を一度に複数の変数に代入する
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | 分割代入 | (該当なし) | (該当なし) |
英語名 | Destructuring assignment | - | - |
コード例 |
const obj = {a: 1, b: 2} const {a, b} = obj // a=1, b=2 |
- | - |
備考 | メソッドの引数でも使用できる。キーワード引数の代替になる。 | 引数を受け取る場面ではキーワード引数が利用可能 | 引数を受け取る場面ではキーワード引数が利用可能 |
配列を展開してメソッドの引数にする
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | スプレッド構文 | 配列展開*1 | アンパック |
英語名 | Spread syntax | Splat operator | Unpacking |
コード例 |
const myFunction = (a, b) => { console.log(`a:${a}, b:${b}`) } const arr = [1, 2] myFunction(...arr) // a:1, b:2 |
def my_function(a, b) puts "a:#{a}, b:#{b}" end arr = [1, 2] my_function(*arr) # a:1, b:2 |
def my_function(a, b): print(f'a:{a}, b:{b}') my_list = [1, 2] my_function(*my_list) # a:1, b:2 |
備考 | 配列展開に使用される"*"をsplat operatorという | 配列展開に使用される"*"をstar operatorという |
オブジェクトを展開してメソッドの引数にする(キーワード引数)
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | (該当なし) | (不明)*2 (ハッシュ展開*3 ) |
アンパック |
英語名 | - | Double splat operator | Unpacking |
コード例 | - |
def my_method(a:, b:) puts "a:#{a}, b:#{b}" end my_hash = { a: 1, b: 2 } my_method(**my_hash) # a:1, b:2 |
def my_function(*, a, b): print(f'a:{a}, b:{b}') my_dict = {'a': 1, 'b': 2} my_function(**my_dict) # a:1, b:1 |
備考 | 分割代入を使用して、キーワード引数に似た機能を使用できる
const myFunction = ({a, b}) => { console.log(`a:${a}, b:${b}`) } const obj = {a: 1, b: 2} myFunction(obj) // a:1, b:2 |
"**"をつけなくても動くが、つけるのが推奨されている。 |
配列を展開して配列を結合する(ときに記号を使った書き方)
いずれも2つの配列を結合して新たな配列を作ります。もとの配列は変化しません。
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | スプレッド構文 | Array#+ | 加算演算子 |
英語名 | Spread syntax | Array#+ | addition operator |
コード例 |
arr1 = [1, 2] arr2 = [3, 4] arr3 = [...arr1, ...arr2] // [1, 2, 3, 4] |
arr1 = [1, 2] arr2 = [3, 4] arr3 = arr1 + arr2 # [1, 2, 3, 4] |
list1 = [1, 2] list2 = [3, 4] list3 = list1 + list2 # [1, 2, 3, 4] |
備考 |
キーバリューを展開してキーバリューを結合する(ときに記号を使った書き方)
いずれも2つのキーバリューオブジェクトを結合して新たなキーバリューオブジェクトを作ります。もとのキーバリューオブジェクトは変化しません。
JavaScript | Ruby | Python | |
---|---|---|---|
日本語名 | スプレッド構文 | (不明)*4 (ハッシュ展開*5 ) |
アンパック |
英語名 | Spread syntax | Double splat operator | Unpacking |
コード例 |
obj1 = {a: 1, b: 2} obj2 = {c: 3, d: 4} obj3 = {...obj1, ...obj2} // {a: 1, b: 2, c: 3, d: 4} |
hash1 = {a: 1, b: 2} hash2 = {c: 3, d: 4} hash3 = {**hash1, **hash2} # {:a=>1, :b=>2, :c=>3, :d=>4} |
dict1 = {'a': 1, 'b': 2} dict2 = {'c': 3, 'd': 4} dict3 = {**dict1, **dict2} # {'a': 1, 'b': 2, 'c': 3, 'd': 4} |
備考 |
あとがき
配列、キーバリュー周りに関しては、意外とRubyとPythonの記法が似ていました。キーワード引数については、Pythonの記法をRubyでも使えるようにしたものだそうです。
配列もキーバリューのオブジェクトの名前も、それらに関する操作の名前ももっと言語間で統一してくれたらいいのにな、と思いました。 新しい言語を作る時には新しい名前を付けたくなるのかも。