Ruby

あなたの知ってるRubyGemsTips で LT してきた

あなたの知ってるRubyGemsTips で LT してきました。 LT よかったよー、と言ってもらえたのでよかったよかった。 printf デバッグが捗る gem をつくった話 2年ぐらい前に binding-debug という gem をつくったんですが、最近いろいろと機能拡張したのでそれ…

Ruby でクラス名と同名のメソッドを定義する

Ruby ではクラスと同じ名前のメソッドを定義する事ができます。 class X end def X(a = nil) "X(#{a})" end # 何もつけなかった場合はクラスを参照 p X # => X # メソッドぽい呼び出しであればメソッドを参照 p X() # => "X()" p X 42 # => "X(42)" この手の…

Ruby の private メソッドを特定のコンテキストで public にする

Ruby では次のように private メソッドにすると『レシーバをつけたメソッド呼び出し』ができません。 class X private def value 42 end end x = X.new # error: private method `value' called for #<X:0x00007fabe905fa40> (NoMethodError) x.value こういうときに refinements </x:0x00007fabe905fa40>…

Ruby で任意の定数を参照した際に警告が出るようにする

Ruby で任意の定数を参照した際に警告が出るようにしたい場合、 Module#deprecate_constant を利用することができます。 class X Hoge = 42 end # no warning X::Hoge # X::Hoge を参照すると警告を出すようにする X.deprecate_constant :Hoge # warning: co…

Omotesando.rb #54 で『ActiveRecord のコードを読んでみる』をしてきた

Omotesando.rb #54 で LT してきました。 今回は「コードの読み方」というテーマだったせいかいつもよりもめっちゃ人が集まっていましたねー。人が多いけど懇親会でぼっちだったワイ やっぱり「コードの読み方」っていうのは初心者から上級者まで興味がある…

irb で実行結果を pp で出力する

irb で実行結果を pp で出力する手段がいくつかあるのでまとめ。 irb の起動オプションで変更する irb の起動オプションに --inspect pp を追加することで pp の出力になります。 $ irb --inspect pp irb(main):001:0> (1..10).to_h { |it| [it, it] } = > {…

ActiveRecord で実行される sql を確認する

ActiveRecord で実行される sql を確認したい場合、 #to_sql メソッドが利用できます。 # このリレーションでレコードを読み込む場合に実行される SQL を文字列で取得する p Blog.joins(:articles).where(articles: { name: "hoge" }).to_sql # => "SELECT \…

ActiveSupport::TimeWithZone#+ に数値を渡したときの挙動

ActiveSupport::TimeWithZone#+ に値を渡すと『渡した時間を加算した時刻』を返します。 # 現在の時刻 current_time = Time.current pp current_time # => Mon, 06 Jan 2020 20:10:15 JST +09:00 # + 1日 pp current_time + 1.days # => Tue, 07 Jan 2020 20…

2019年 まとめ

今年一年の振り返りです Ruby Ruby にパッチ投げたりチケット立てたりした 今年つくった bugs.ruby のチケット一覧 知り合いのコネで開発者会議に参加させてもらった いつも内容が濃ゆい 勉強会で Ruby の LT しまくった 詳細は後述参照 reline に GitHub Ac…

RSpec の satisfy マッチャを便利に使う

Model のテストなどを書く時に次のように任意のリレーションに対して意図するクエリが追加されているかどうかをテストすることがあると思います。 class User < ActiveRecord::Base # rate 基準で上位10人を絞り込む scope :top10, -> { where(active: true)…

Ruby の remove_method と undef_method の違い

さてさて、せっかくアドベントカレンダーでブログを書き続けているのでどうせならこのまま書き続けていこうかなーと思います。 まあすぐに止まりそうですが。 今回の内容は某所でちょっと話題になっていたので覚書。 remove_method と undef_method の違い r…

Ruby 2.7 がリリース

例年どおり昨日 25日に Ruby 2.7 がリリースされました。 Ruby 2.7.0 リリース Ruby 2.7 の開発はだいぶ追っていたんですが追加された機能もあれば実装されたけど最終的に Revert されてしまった機能もあり割と起伏が激しい印象です。 なんだよ、最終的に Re…

Omotesando.rb #53 で『reline に GitHub Actions を追加した話』をしてきた

ちょっと前ですが、先週木曜日に Omotesando.rb に行って LT してきました。 そこで体調にトドメを刺された気がする ちなみに 表参道.rb → Omotesando.rb になってオシャレなロゴが追加されています。 reline に GitHub Actions を追加した話 実は最初は初心…

【Ruby on Rails Advent Calendar 2019】ActiveRecord で後から where クエリを上書きする【2日目】

Ruby on Rails Advent Calendar 2019 2日目の記事になります。 今回は最近ハマっているクエリメソッド付けたり外したりしていることを簡単に書いてみようかと思います。 サンプルモデル 今回は以下のような scope を定義したモデルを例として説明していきた…

【Ruby Advent Calendar 2019】ピュア Ruby で Ruby 2.7 の Numbered parameter を実装してみよう!【1日目】

Ruby Advent Calendar 2019 1日目の記事になります。 本記事では Ruby 2.7 で実装される Numbered parameter っぽい機能をピュアRuby で実装してみたいと思います。 またこの記事の実装は以下の記事を参考にして書いています。 Rubyのブロックつらい問題を解…

Ebisu.rb #26 で LT してきた

LT いいながらめっちゃ長々と話してしまってすみませんすみません…。 Ebisu.rb に参加してきました。 Ebisu.rb は先月始めて参加して今回で2回目の参加になります。 表参道.rb みたいに雰囲気がよかよかな地域.rb の勉強会です(別に他の勉強会の雰囲気が悪…

表参道.rb #52 で LT してきた

思い出したかのように記事を書きます。 相変わらず懇親会でぼっち力を発揮しているので無限につらい。 Ruby 2.7.0-preview2 のリリースノートを読もう 元々はこの間リリースされた Ruby 2.7.0-preview2 のリリースノートをリアルタイムに読みながらわいわい…

Ruby で文字列の中に含まれている文字列の数を調べたかった

Ruby で文字列の中に含まれている文字列の数を調べたかったんですが、パッと思いつかなかったのでメモ。 現状ではそういうメソッドがないので #scan を使って代用しました。 p "hoge hogehoge h hoge foohoge".scan("hoge").count # => 5 これぐらいなら専用…

Tama.rb に行ってモブプロをやって feature spec をリファクタリングした話

と、いうことで最近噂の Tama.rb が前々から気になったので初めて参加してモブプロをやってきました! Tama.rb #17 Everyday Rails - RSpecによるRailsテスト入門 - connpass 今回の Tama.rb の内容は Everyday Rails - RSpecによるRailsテスト入門 を読みな…

Ruby 2.7 で Enumerable#filter_map が追加される

Ruby 2.7 で Enumerable#filter_map が追加される予定です。 filter_map という名前の通り filter + map を行います。 pp (1..10).filter_map { |i| i + i if i.even? } # => [4, 8, 12, 16, 20] ブロックの戻り値が nil もしくは false である要素を取り除…

Ruby 2.7 で in 演算子が使えるようになる

Ruby 2.7 で in 演算子が使えるようになります。 そもそも in 演算子ってなんやねんって話なんですが、同じく Ruby 2.7 で入る予定のパターンマッチ構文の in になります。 例えばパターンマッチを使用することで次のような判定を行うことが出来ます。 def c…

Ruby 2.7 で private メソッドが self. 付きで呼び出せるようになる

Ruby 2.7 で private メソッドが self. 付きで呼び出せるようになる予定です。 Feature #16123: Allow calling a private method with self. - Ruby master - Ruby Issue Tracking System Feature #11297: Allow private method of self to be called - Ruby…

Ruby のブロック構文の中身を文字列として取得する

using Module.new { refine RubyVM::InstructionSequence do def to_h %i( magic major_version minor_version format_type misc label path absolute_path first_lineno type locals args catch_table bytecode ).zip(to_a).to_h end end using self refine…

【速報】Ruby 2.7 の Numbered parameters が @1 から _1 に変更され、pipeline 演算子が見送りになった

Numbered parameters の記号が @1 から _1 へ変更へ 表題通りなんですが Ruby 2.7 で導入予定であった Numbered parameters の記号が @1 から _1 へと変更になりました。 Misc #15723: Reconsider numbered parameters - Ruby master - Ruby Issue Tracking …

Ruby 2.7 でスターリンソートを書いてみた

元ネタ 計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell - Qiita と、いうことで Ruby でも書いてみました。 ただ書くだけじゃつまらないので Ruby 2.7 で追加予定のパターンマッチを使ってみるなど。 コー…

表参道.rb #48 で LT してきた

そういえば、書くのを忘れてたので忘れないうちに。 5分ぐらいでわかる Ruby 2.7 Ruby 2.7 で追加される(予定)機能やメソッドの話とかしてきました。 どっちかって言うと機能追加に対する議論とかをもうちょい聞きたかったところ(ナンパラとか。

Ruby の lambda に proc オブジェクトを渡した場合、lambda オブジェクトは返ってこない

某所で話題になっているやつです。 Ruby では Kernel.#lambda で proc オブジェクトを生成した場合 lambda として生成されます。 # Kernel.#proc だと lambda でないオブジェクトを生成する proc_obj = lambda { |a, b| "#{a}:#{b}" } pp proc_obj.lambda? #…

【速報】Ruby の trunk に pipeline operator がはいった

追記 pipeline operator の議論は RubyKaigi 2019 の Ruby Committers vs the World で話が出ていたみたいですね。 www.youtube.com 取り急ぎまとめ。 今日、Ruby の開発者会議に参加させて頂いて、さっき返ってきて ML みてたんですがいつの間にか pipeline…

Ripper でパースエラーを検知しようとしてハマった

Ruby でパースエラーになっている箇所を調べたくて Ripper を使ったらハマったので覚書。 Ripper を使う Ripper とは Ruby に標準で付属している Ruby のコードをパースするためのライブラリです。 Ripper では Ripper というクラスがあり、これを継承してパ…

Ruby のパターンマッチを利用して任意のメソッドが定義されているかどうかを判定する

と、いうのが bugs.ruby に来ていたので。 Feature #15824: respond_to pattern for pattern match - Ruby trunk - Ruby Issue Tracking System class Runner def run end def stop end end runner = Runner.new case runner in .run & .stop :reachable in …