Just do IT

思うは招く

Ruby

Enumerable#inject 初期値ありなしの挙動の違い

レシーバが配列の場合 初期値がない場合 > [1, 2, 3].inject { |result, item| p result + item*2 } 5 11 => 11 初期値がない場合、先頭の要素と2番めの要素をブロックに渡す 上記の場合、resultに1、itemに2が渡されており、item*2されていることから1+4に…

【Ruby】String#split("") をするなら String#chars を使う

> 'AAAAAAAAA'.split("") => ["A", "A", "A", "A", "A", "A", "A", "A", "A"] > 'AAAAAAAAA'.chars => ["A", "A", "A", "A", "A", "A", "A", "A", "A"] 後者のほうがスッキリ書けてよい。

Ruby の divmod メソッドとは

割った数と、余りを配列で返す。 3 ÷ 2をすると、割った数は1、余りは1なので、[1, 1]という配列が返る。 > 3.divmod 2 => [1, 1] selfがマイナスでも計算できる。 > -3.divmod 2 => [-2, 1] selfと割る数がマイナスでも計算できる。 > -3.divmod -2 => [1, …

Ruby の dup と clone の違い

Rubyのリファレンスにはこう書かれている。 dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します dup はオブジェクト内容とtaint情報をコピーする clone は上記に加えて…

Rubyのdupとは何か

結論: dupとはオブジェクトをコピーするメソッドです 細かく言うと「シャロウコピー(Shallow Copy)」します コレクション(配列やハッシュ)をdupするときは要注意です 破壊的な変更は同じobject_idを持つオブジェクトに影響が及ぶ dupのチカラ 配列やハ…

Ruby の eql? と equal? の違い

結論: eql?はオブジェクトの値が同じかどうかを評価する equal?はobject_idが同じかどうかを評価する irb(main):001:0> obj = %w(hoge bar baz) => ["hoge", "bar", "baz"] irb(main):003:0> copy = obj.dup => ["hoge", "bar", "baz"] # 値は同じなのでtru…

Ruby の map と filter_map の違い

結論 map ブロック内の評価を返す ブロック内の実装で加工したものをそのまま返す filter_map ブロック内の評価が真である配列を返す 例1 以下の例では、どちらも同じ値を持つ配列を返す。 p (1..3).map { |n| n * 3 } => [3, 6, 9] p (1..3).filter_map { |…

Ruby String#scan と String#split の違い

結論 scanは、マッチした文字列の配列を返す splitは、マッチした部分で分割した配列を返す 区切り文字を指定する scanの挙動 サンプルとして以下のような文字列を用意する。 str = 'Now I need a drink, alcoholic of course, after the heavy lectures inv…

Ruby でびっくりマークが2つ出てくるアレの意味

Ruby のコードを見ているとよく出てくる!!のやつ。 def user_exists? !!find_user end 呼び方としては、 エスクペラメーションマーク double-bang 二重否定 などがあるみたい。 意味 「true か false を返すメソッドをつくりたい」という場合はよくある。そ…

Ruby や Rails でよく見る、メソッド名の後ろのびっくりマーク(感嘆符)の意味

Rubyだと 基本的には、破壊的な変更を意味する。呼び出したオブジェクト側も変更してしまう。 $ irb > str = 'hoge' => "hoge" #普通にupcaseする > str.upcase => "HOGE" #呼び出したオブジェクトに変更はない > str => "hoge" #破壊的に変更する > str.upc…

Ruby each_with_object の挙動やサンプル

Ruby には each_with_objectメソッドがある。 docs.ruby-lang.org 名前のとおり、eachメソッドを使えて、空の配列やハッシュなどを引数に渡してそれをオブジェクトとして処理できる。最終的には引数に渡した配列やハッシュを返す。 配列の場合 each_with_obj…

Ruby 配列の要素に重複がないか評価する uniq? メソッドはなかった

配列の要素が重複してないかどうか、真偽値を返すuniq?メソッドないかなーと思って探してみたけどなかった。 ということで、なんちゃって uniq? メソッドを作ってみた。 def uniq?(ary) ary.size == ary.uniq.size end ary = ["h", "o", "g", "e", "h", "o",…

Ruby 2.7.0 から使える filter_map メソッドを知った

名前のとおり、filterとmapメソッドを組み合わせたfilter_mapメソッドを知った。Ruby 2.7.0 から追加された。 Returns a new array containing the truthy results (everything except false or nil) of running the block for every element in enum. ruby-…

Ruby でレシーバの要素数を返すメソッド count

Enumerable#count (Ruby 2.7.0 リファレンスマニュアル) ・引数なしの場合、レシーバの要素数を返す ary = [1, 2, 4, 2] ary.count # => 4 ・引数をひとつ指定した場合、レシーバの要素から合致するものを返す ary = [1, 2, 4, 2] ary.count(2) # => 2 ※2を…

Ruby 配列の要素を降順、昇順に並べたい

降順にソート。 [10, 30, 20, 25, 35].sort => [10, 20, 25, 30, 35] 昇順にソート。シンプルにreverseをしてみる。 [10, 30, 20, 25, 35].sort.reverse => [35, 30, 25, 20, 10]

Ruby 配列の要素でもっとも大きい、小さい値を取得したい

もっとも大きい値を取得する。 [10, 30, 20, 25, 35].max => 35 大きい値の上位3つを取得する。 [10, 30, 20, 25, 35].max(3) => [35, 30, 25] もっとも小さい値を取得する。 [10, 30, 20, 25, 35].min => 10 小さい値の上位3つを取得する。 [10, 30, 20, 25…

Ruby で配列内の空文字を削除したい

rejectメソッドを使った場合。 #空文字が入った配列 ary = ["hoge", "bar", "", "baz"] p ary.reject { |el| el.empty? } => ["hoge", "bar", "baz"] 省略すると以下のように書ける。 p ary.reject(&:empty?) => ["hoge", "bar", "baz"] rejectメソッドは、…

Ruby や Rails で桁数を3行ごとにカンマで区切る

Ruby の場合 素の Ruby の場合、該当するメソッドはないため自作する。 数値をいったん文字列にして、正規表現を使ってカンマを加える。 数値.to_s.gsub(/(\d)(?=\d{3}+$)/, '\\1,') 使用例 irb(main)> 500000000.to_s.gsub(/(\d)(?=\d{3}+$)/, '\\1,') => "…

Ruby で配列を展開して push したい

以下のような配列があったとする。 ary = ['a', 'b'] hoge = ['c','d'] 普通に push すると、多次元配列になる。 ary.push(hoge) => ["a", "b", ["c", "d"]] *をつけると、引数として渡された配列が展開されて push できる。(splat展開と呼ぶ) ary.push(*h…

Ruby 3.0.0-preview1 を触ってみた

2020年9月25日、Ruby 3.0.0-preview1 がリリースされた。 Ruby 3.0.0 Preview 1 Released インストール $ brew upgrade rbenv ruby-build $ rbenv install --list-all | grep 3.0.0 3.0.0-dev 3.0.0-preview1 #インストール $ rbenv install 3.0.0-preview1 …

Ruby Array#delete_if の挙動

delete_ifは配列やハッシュに使えるメソッド。 ブロックを渡して、配列やハッシュの要素に該当する要素を削除する。 要素を順番にブロックに渡して評価し、その結果が真になった要素をすべて削除します。 delete_if は常に self を返します Array#delete_if …

RExの問題を振り返る3

REx - Ruby Examinationで出てきた問題を振り返る。 以下のコードを実行するとどうなるか? hoge = "a".to_h puts hoge.class 解答 nilエラーがでる。なぜならaはStringで、Stringクラスにto_hメソッドは使えない。 irb(main):001:0> hoge = "a".to_h NoMeth…

RExの問題を振り返る2

REx - Ruby Examinationで出てきた問題を振り返る。 問題 次のコードを実行するとどうなりますか。 s = <<'EOF' Hello, Ruby EOF 'EOF' p s 解答 以下が表示される。 "Hello,\nRuby\n" 解説 これはヒアドキュメントという機能を使ったもの。 普通の文字列リ…

RExの問題を振り返る1

REx - Ruby Examinationで出てきた問題を振り返る。 問題 $valはどんな値になりますか? $val = 0 class Count def self.up $val = $val + 1 $val == 3 ? true : false end end [*1..10].any? do Count.up end p $val 解答 答えは3。 なぜそうなるのか、ひと…

Ruby で特定の期間からランダムに日付を取得したい

Random.rand(日付の期間..日付の期間)で取得できる。 irb> require 'date' start_day = Date.new(2020, 6, 15) last_day = Date.new(2020, 9, 15) irb(main):003:0> Random.rand(start_day..last_day) => Sat, 05 Sep 2020 irb(main):004:0> Random.rand(sta…

Ruby で 配列からランダムに要素を取得したい

Array#sampleが使える。 ary = [*(1..20)] irb(main):004:0> ary.sample => 1 irb(main):005:0> ary.sample => 8 irb(main):006:0> ary.sample => 18 docs.ruby-lang.org k-koh.hatenablog.com

Ruby で配列にたくさんの数値を簡単に代入したい

下記のように数値を範囲で指定して配列に代入できる。カンタン便利。 irb(main)> ary = [*(1..20)] => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Ruby で2次元配列を1次配列に変換するメソッド flatten が便利

ある API へアクセスして、特定の値だけを配列に入れていきたかった時、配列がどんどんネストしてしまっていた。 だが、flattenメソッドを使えば文字通り配列を平らにできる。 Array#flatten (Ruby 2.7.0 リファレンスマニュアル) ary = %w[hoge bar] ary2 =…

Ruby dynamic constant assignment エラー

問題 Rubyを実行すると以下のエラーが出た。 dynamic constant assignment 解決 メソッド内で定数を定義しているのが原因だった。Ruby では、メソッド内で定数の定義ができない。 #これはできない def hoge API_KEY = '' end #メソッドの外で定義する API_KE…

Ruby で配列から条件に一致するインデックスを取得したい

やりたいこと ある配列に入った要素をひとつずつ確認して、引数に渡した要素と比較し、合致した場合のインデックスを取得したい。 方法 indexやfind_indexが使える。 指定された val と == で等しい最初の要素の位置を返します。等しい要素がひとつもなかっ…