Just do IT

思うは招く

【Ruby】Array#combination と Array#repeated_combinationの違い

Array#combination

RubyArray#combinationは、配列内の要素の各組み合わせをすべて作る。

Array#combination (Ruby 3.1 リファレンスマニュアル)

まずはシンプルな例から。たとえば、バスケ選手が3人集まって1on1をしたいとする。3人の1on1の組み合わせを計算したいときはこんなふうに使える。

arr = %w[jason jaylen james]

arr.combination(2).to_a
=> [["jason", "jaylen"], ["jason", "james"], ["jaylen", "james"]]
  • 引数に2を渡しているので、2人組の組み合わせを返している
  • Array#combinationだけ書いた場合はEnumeratorオブジェクトを返す

なお、Array#combination["jason", "jayson"]といった重複は返さない。

では、引数に3を渡すとどうなるか?

> arr.combination(3).to_a
=> [["jason", "jaylen", "james"]]

3人の組み合わせは1通りしかないので、1つの配列になって返る。

arr.combination(2).to_aで重複を発生させたい場合はArray#repeated_combinationが使える。

Array#repeated_combination

Array#repeated_combination (Ruby 3.1 リファレンスマニュアル)

> arr = %w[jason jaylen james]

# 重複が発生している
> arr.repeated_permutation(2).to_a
=>
[["jason", "jason"],
 ["jason", "jaylen"],
 ["jason", "james"],
 ["jaylen", "jason"],
 ["jaylen", "jaylen"],
 ["jaylen", "james"],
 ["james", "jason"],
 ["james", "jaylen"],
 ["james", "james"]]

# combinationメソッドは重複させない
> arr.combination(2).to_a
=> [["jason", "jaylen"], ["jason", "james"], ["jaylen", "james"]]

参考 - Ruby Arrayの組み合わせ系メソッドまとめ - Qiita

Railsでカラムの属性を調べる方法

モデル.column_hash['属性を知りたいカラム名'].typeでいける。

> User.columns_hash['email'].type
=> :string

普通ならスキーマとか、annotate gemを入れていたらモデルファイルを見れば済む話だけど、rails consoleを触っていてカラムの属性を知りたくなった時とかに便利。

【Ruby】{} と Hash.new(0) でハッシュを作るときの違い

一見すると、どちらも同じハッシュを作っているように見える。

irb(main):001:0> Hash.new(0)
=> {}

irb(main):002:0> {}
=> {}

では何が違うのか?

  • Hash.new(0)はハッシュのデフォルト値を設定している
  • {}はデフォルト値を設定していない
irb(main):003:0> Hash.new(0)['a']
=> 0

irb(main):004:0> {}['a']
=> nil