Ruby

今週の気になった bugs.ruby

書き溜めてはいたんですが、ブログに公開するのを忘れてました。 内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。 先週のまとめ [Feature #16986] Anonymous Struct literal Struct.new(:a, :b).new(…

Ruby でメソッドの戻り値を受け取るかどうかを判定する RubyVM.return_value_is_used? が面白そう

こんな深夜に Ruby で面白そうなチケットを見かけたのでいろいろと試してみました。 チケット: [Feature #17004] Provide a way for methods to omit their return value PR : Provide a way for methods to omit their return value (rev.2) by shyouhei ·…

Ruby で 1 == true を行うと何が起きるのか

元ネタ Ruby の true と false がわかってない, いつも if 1 == true みたいなの書いて false 返されてあれ?ってなってる— ima1zumi (@ima1zumi) June 29, 2020 まあ 1 と true は別オブジェクトだからなーと思いつつ 1 == true は例外を返してほしいなーと…

今週の気になった bugs.ruby

内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。 先週のまとめ [Bug #11669] inconsitent behavior of refining frozen class freeze されたクラスに対して Refinements で新しいメソッドを定義する…

Ruby のクラス変数とクラスのインスタンス変数の違い

Ruby のクラス変数とクラスのインスタンス変数の違いの覚書。 クラス変数 Ruby で @@変数名 で変数を定義するとクラス変数として定義されます。 また、この変数は継承したクラスでも参照する事ができます。 class X @@class_variable = "hoge" end class Y <…

Ruby の標準ライブラリに Hash#except が追加された

Ruby の標準ライブラリに Hash#except が追加されました。 ActiveSupport にある有名なやつですね。 特に問題がなければ Ruby 2.8/3.0 で追加される予定です。 チケット Feature #15822: Add Hash#except - Ruby master - Ruby Issue Tracking System コード…

今週の気になった bugs.ruby

1週間だとあんまりたまらないかと思ったんですが思ったよりもたまりました。 内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。 先週のまとめ Feature #16378 Support leading arguments together with…

Ruby の or と and の優先順位

Ruby の or と and は優先順位がとても低いです。 例えば x = 1 or 2 は (x = 1) or 2 と解釈され foo || bar and hoge は (foo || bar) and hoge と解釈されます。 ちなみに次のようなコードはシンタックスエラーになります。 # syntax error, unexpected `…

今週の気になった bugs.ruby のチケット

なんとなく書き溜めるようにしてみました。 内容は適当です。 今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。 Feature #16828 Introduce find patterns パターンマッチで条件にマッチした一部の要素だけ取得できる提…

Ruby で循環参照してる配列で deep_dup するとどうなるか

deep_dup の話が Twitter で出たので試してみました。 ActiveSupport の #deep_dup をつかった場合 ActiveSupport に #deep_dup の実装があるのでそれで試してみました。 require "active_support" require "active_support/core_ext/object/deep_dup.rb" a …

Ruby の右代入とエンドレスメソッド定義文を組み合わせるといろいろとつらいことがわかった

さてさて、先日 Ruby の開発版に右代入とエンドレスメソッド定義構文が入りました。 この構文については以下を参照してください。 Ruby の開発版に右代入演算子とエンドレスメソッド定義構文が入った この2つの機能を組み合わせて使うといろいろとつらいこと…

Ruby 2.7 でも 1行 in を利用して右代入を行う

さてさて、先日 Ruby の開発版に右代入を行う => 演算子が追加されました。 これは 左辺値 を 右辺の変数 へ代入するための演算子になります。 1 + 2 => result result # => 3 参照:Ruby の開発版に右代入演算子とエンドレスメソッド定義構文が入った Ruby …

Ruby の開発版に右代入演算子とエンドレスメソッド定義構文が入った

Ruby の開発版に右代入演算子と実験的にエンドレスメソッド定義構文が新しく追加されました。 右代入演算子 チケット:https://bugs.ruby-lang.org/issues/15921 pull request:https://github.com/ruby/ruby/pull/3012 左辺値を右辺の変数に代入する => 演…

あなたの知ってる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 のリリースノートをリアルタイムに読みながらわいわい…