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 …

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…

2018年振り返り

2018年振り返り ということで今年やった事振り返りでも。 今年も今日で最後。 Ruby にパッチいっぱい投げた Ruby にパッチいっぱい投げました。 その結果、Ruby 2.6 ではパッチが4つ取り込まれました、わーい。 どんなパッチを投げたのかはこちらを参照。 Ru…

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(の…

deoplete.nvim をいれてみた

Vim

完全に食わず嫌いっていうか現状の neocomplete.vim で満足していたんですが、稀によく補完が重すぎてアイエエエエエとなることがあるので、重い腰を上げて deoplete.nvim を入れてみました。 導入 NeoBundle "Shougo/deoplete.nvim" NeoBundle "roxma/nvim-yarp" N…

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 とは結構雰囲気が違っていたような感じでし…

Vim 8.1 がリリース!!

Vim

朝起きたら Vim 8.1 がリリースされていました。 Vim 8.0 のリリースが 2016/09/12 なので約1年8ヶ月ぶりとなるリリースです。 大きな追加点としてはやはり :terminal が実装されたことですかね。 わたしは :terminal はクソだと思っているんですが、リリー…

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

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

第9回 学生エンジニア限定LT大会!!!でスライドの作り方の LT してきた

もう1週間以上も経ってしまいましたが第9回 学生エンジニア限定LT大会!!!に遊びに行ってきました。 自分でブログ書けと言って書いてなかった 今回は寿司とピザを食べることが出来たぞ!!! [reveal.js + markdown でスライドをつくろう!!] と、言うこ…