Ruby

Ruby の trunk に(実験的に)パターンマッチ構文が入った!

Ruby の trunk にパータンマッチ構文が実験的に導入されました。 Introduce pattern matching [EXPERIMENTAL] · ruby/ruby@9738f96 · GitHub Feature #14912: Introduce pattern matching syntax - Ruby trunk - Ruby Issue Tracking System NOTE: 実験的に…

最近気づいた継承と mixin の違い

最近気づいたんですが、 継承したスーパークラスのクラスメソッドをサブクラスから呼べる mixin したモジュールのクラスメソッドは呼べない っていう違いがあるんですね。 class Super def self.super_class_method "Super#super_class_method" end def supe…

Ruby の private セッターメソッドは self. をつけても呼び出すことが出来る

さて、 Ruby の private メソッドは通常レシーバを付けて呼び出す事が出来ません。 class User private def age 42 end end user = User.new # NG : private method `age' called for #<User:0x0000562111c42218> (NoMethodError) p user.age これは self. を付けても同じです。 class</user:0x0000562111c42218>…

Ruby 2.7 で `Enumerable#tally` というメソッドが追加される

Ruby 2.7 で Enumerable#tally というメソッドが追加されます。 Feature #11076: Enumerable method count_by - Ruby trunk - Ruby Issue Tracking System あまり聞き慣れない単語のメソッドですが、これは『同じ要素の数を Hash で返す』というメソッドにな…

Ruby のトップレベルメソッドって結局なんなの

以下のような質問があったのでちょっと解説。 @pink_bangbi 僕はselfの概念がつかめておらず、バンビさんが以前書かれた記事で4つ目と5つ目(■)の項目の意味が理解できませんでした。 暇な時で構いませんので解説をいただきたいです。 pic.twitter.com/ZgX…

Rails の touch 時に処理をフックする

任意のレコードの updated_at のみを更新する際に ActiveRecord の #touch を使うことはあると思います。 class User < ActiveRecord::Base end user = User.create(name: "Homu") pp user.updated_at.iso8601(10) # => "2019-02-18T12:36:37.2315494900Z" #…

Rails で default_scope を複数定義すると…

Rails で default_scope を複数定義した場合、『両方の default_scope 』が適用されます。 class Article < ActiveRecord::Base default_scope { where(published: true) } default_scope { where(rating: 'G') } end Article.all # => SELECT * FROM articl…

Ruby でメソッド呼び出しの末尾に空の , があってもエラーにならない

来年はいっぱいアウトプットするぞ〜〜〜といいながら全然やってませんがわたしは元気です。 ところで Ruby って以下のコードみたいに meth(1, 2, ) っていう呼び出しはエラーにならないんですね。 普通に動いてて驚きました。 def meth a, b a + b end p me…

Ruby でワンライナーでズンドコキヨシ

元ネタ Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰…

Ruby 2.6 に投げたパッチが取り込まれた話

先日 Ruby 2.6 がリリースされましたが、それにわたしが投げたパッチが4つ含まれています。 と、いうことで具体的にどんなパッチを投げてどんな機能が取り込まれたのかを簡単に書いてみようかと Refinements で定義した #to_proc が &hoge 時に呼ばれないの…

今日は Ruby 2.6 がリリースされる日!!

今日は年に一度の Ruby がリリースされる日ですね!!! クリスマス?知らないですねえ…。 と、言うことで Ruby 2.6 が無事にリリースされました。やったー! Ruby 2.6.0 Released NEWS for Ruby 2.6.0 そんなわけで気になった機能をいくつか上げてみようか…

Ruby における関数オブジェクトとブロック引数とは…?

Ruby 2.6 で追加される Proc#>> に Symbol も渡したいよねー内部で #to_proc も呼び出してほしいよねーと考えた時の覚書。 現在 Proc#>> には #call が定義されているオブジェクトを渡せる なにをしたい Proc#>> に #to_proc が定義されているオブジェクトも…

【Ruby Advent Calendar 2018】あなたのしらない Refinements の世界【3日目】

Ruby Advent Calendar 2018 3日目の記事になります。 なんとか日付が変わる前に書けました…。 何を書こうか迷ったんですが、この記事では今年 Ruby にパッチを投げまくったディープな Refinements の世界について書いてみようかと思います。 そもそも皆さん …

Ruby の Hash をソートする時の注意

Hash をソートしたい場合、Hash#sort でソートすることが出来るんですが、このメソッドは [key, value] の配列に変換してからソートが行われます。 なので Hash#sort の戻り値も配列になります。 hash = { b: "homu", c: "mami", a: "mado" } # #sort の戻り…

Ruby で yield_self のめっちゃ便利な使い道

Ruby 2.5 で追加された #yield_self という地味に便利なメソッドがあります。 これは『レシーバを引数としてブロックを呼び出す』というメソッドになります。 既存のメソッドとして #tap と似ていますが、#tap とは異なり『ブロックの戻り値を #yield_self …

Ruby 2.5 系で CSV.generate のバグ

Ruby 2.5 系で CSV.generate を使用しようとしたら意図しない動作をして、調べてみたらバグだったのでそのまとめ。 しかし、これ、結構クリティカルなバグだと思うんですけど、全然話題になってないのが不思議(当時は話題になっていたのかもしれないけど。 …

Ruby で nil が含まれている配列をソートする

さて、Ruby の配列でソートを行いたい場合、配列内に nil があるとうまくソートできないことがあります。 ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil] # Error: comparison of String with nil failed (ArgumentError) ary.sort これは、『…

Kernel.#proc でブロックを渡さなかった時の挙動

さて、 Kernel.#proc といえば普通は『ブロックをオブジェクトとして扱う時』に使用します。 # ブロックをオブジェクト化する plus = proc { |a, b| a + b } # もしくは Proc.new でもどうようの挙動になる # plus = proc { |a, b| a + b } # #call でブロッ…

Ruby Hack Challeng で Refinements のバグを治そうとした話

前回参加した Ruby Hack Challeng からだいぶ時間が経ってしまったんですが、その時にやっていたことを覚書程度に書いておこうかと。 ちなみにバグと言っていますが、バグなのか微妙なところだったり。 あと結構フィーリングで書いているので実際の Ruby(の…

Cookpad Ruby Hack Challenge #5 [二日間開催] に行ってきた話

先週の月木に Cookpad Ruby Hack Challengeに行ってきました。 わたしは今回で4回目の参加になります。 1日目 1日目はコミッタの人が Ruby の実装や内部についてお話しつつ、実際に Ruby のコードを見たり触ったりしよう、というような内容でした。 1日目は…

Ruby で HTML を整形する

最近 HTML をゴニョゴニョする事が多いんですが、HTML が整形されておらず見づらい事がままあります。 いい感じに整形して出力したいなーと思って調べてみたら標準ライブラリに CGI.pretty というのがありました。 require "cgi" html = <<~EOS <html> <head> <title>Example D</title></head></html>…

Ruby でメソッドの定義元をシュッと調べる

デバッグなどしている時に Rails の実装を読みたい!、ということはよくあると思うんですが、そういう時にシュッと定義元を開きたいですよね。 優秀な IDE とかだとそういう機能もあるかもしれませんが、irb や pry を実行している時にサクッと調べたいです…

[CombNaf x 学生LT] 第12回 学生エンジニアLT大会!!!で LT してきた

してきました。 相変わらず学生ではないんですが、遠目で見ていたりします。 今回は普段の学生LT とは違い CombNaf という別のコミュニティと合同で開催されました。 そのため、参加者が多かったり、普段の学生LT とは結構雰囲気が違っていたような感じでし…

3,4月で気になった Ruby のパッチ、提案

書こう書こうと思っていて結局書いてなかったシリーズ。 とりあえず、現状まとめていたやつだけ放出。 Feature #14579: Hash value omission - Ruby trunk - Ruby Issue Tracking System JavaScript みたいに Hash を定義する時に『値を省略してキーだけ渡し…

1,2月で気になった Ruby のパッチ、提案

去年、Ruby のパッチを書き始めた頃から開発者向けの ML に参加しているんですが、その中で面白そうなパッチや提案が結構目に付くので定期的にまとめてみようかと。 Feature #13784: Add Enumerable#filter as an alias of Enumerable#select - Ruby trunk -…

Ruby 25 周年記念パーティでデバッグ出力を行う gem つくってきた

今日 2018年2月24日は Ruby が誕生してちょうど 25年目! ということで記念パーティに行ってきました。 まあなんとなく行ってきたんですが、別に偉い人の話を聞いてもしょうがないので会場ではひたすら Ruby のコードを書いていました。人の話を聞いているよ…

表参道.rb #31 で LINE でお天気bot をつくった話をしてきた

LT してきました。 今回もご飯がとても美味しすぎた…。 LINE でお天気bot をつくった話 https://osyo-manga.github.io/slide-omotesandorb-31-otenki-bot/index.html#/ と、いうことで今回は珍しく生産性のある話をしてきました。 年末に LINE でお天気 bot …

Ruby で (a ==1 && a== 2 && a==3) の結果を真にする

と、いうのが JavaScript 界隈で流行っているので Ruby でもやってみた == メソッドを定義する 多分一番簡単なやり方。 比較演算子そのものの結果を変えます。 a = Object.new def a.== other true end p a == 1 && a == 2 && a == 3 # => true a メソッドを…

Ruby の Hash のキーを Symbol に変更する

Ruby の Hash のキーを Symbol に変更したい場合、Ruby 2.5 で追加された Hash#transform_keys を使うとよさそう。 hash = { "name" => "homu", "age" => 14 }.transform_keys(&:to_sym) # => {:name=>"homu", :age=>14} こういうのをやりたいことは稀によく…

Toyama.rb に参加してきた

タイミングよくちょっと近くへ行く用事があったの Toyama.rb に参加してきました。 勉強会の内容はみんなで雑談しながらもくもくして最後にやったことを各自で発表するような会です。 やったこと Ruby 2.5 の導入 Ruby 本体をビルド ファイルローカルなトッ…