yucatio@システムエンジニア

趣味で作ったものいろいろ

JavaScript Ruby Pythonの配列やキーバリュー要素を展開したり多重代入したりする操作の名前と記号

こんにちは。JavaScriptRubyPythonが頭の中でごちゃごちゃになっているブログ主です。

JavaScriptRubyPythonの配列とキーバリューオブジェクトが頭の中でごちゃごちゃです。ググろうとしても、「あの、アスタリスクつける操作、なんだっけ」となり、やりたいことをググる以前に操作の名前をググる必要があり、その際記号だと検索に引っかかりづらいため、かなり時間を取られます。 そんな自分のために、配列とキーバリューオブジェクトの記号を使った展開や代入の操作をまとめました。

配列とキーバリューオブジェクトの各言語での呼び名

配列とキーバリューオブジェクトの各言語での呼び名です。 配列とは何か、キーバリューオブジェクトとは何かの定義はしないので、以下を見てなんとなく理解してください。

JavaScript Ruby Python
配列 配列(Array) 配列(Array) リスト(list)
キーバリュー ハッシュ(Hash) オブジェクト(Object) 辞書(dictionary)

環境

動作を確認したバージョンです。

配列とキーバリューオブジェクトの各言語での記号を使用した展開や代入の名前とサンプルコード

配列とキーバリューオブジェクトの、各言語での記号を使用した展開や代入の名前とサンプルコードです。 サンプルコードは代表的な使用法に限りました。名前が分かれば細かい部分は検索が可能と思いますので。 各言語、細かい違いがありますので、使用の際には公式ページをご覧ください。名称に公式ページへのリンクが張ってあります。

配列の要素を一度に複数の変数に代入する

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}
備考

あとがき

配列、キーバリュー周りに関しては、意外とRubyPythonの記法が似ていました。キーワード引数については、Pythonの記法をRubyでも使えるようにしたものだそうです。

配列もキーバリューのオブジェクトの名前も、それらに関する操作の名前ももっと言語間で統一してくれたらいいのにな、と思いました。 新しい言語を作る時には新しい名前を付けたくなるのかも。

*1:配列展開というのが正式名称ではなく、「引数の直前に * がついている場合、その引数の値が展開されて渡されます。」という記述から配列展開という言葉を使用しています

*2:日本語の公式ページに記載が見つけられませんでした。情報求めます

*3:配列展開の転用。個人ブログでこのように呼んでいるケースもあります

*4:同上

*5:同上