Ruby

【一人 Ruby Advent Calendar 2017】ブロックについていろいろ【4日目】

一人 Ruby Advent Calendar 2017 4日目の記事になります。 ちょっと遅れてしまい申し訳ありません。 さて、今回は Ruby といえばブロック、ブロックといえば Ruby ぐらいに Ruby の特徴的な機能の1つであるブロックについてみます。 ブロックとは Ruby では…

【一人 Ruby Advent Calendar 2017】case-when と === 演算子について【3日目】

一人 Ruby Advent Calendar 2017 3日目の記事になります。 さて、今回は case 式の when 節と #=== 演算子について簡単に解説してみたいと思います。 case 式 さてさて、Ruby の case 式は以下のようにして when 節と組み合わせて使います。 def func n case…

【一人 Ruby Advent Calendar 2017】文字列から任意のクラスオブジェクトを取得する【2日目】

一人 Ruby Advent Calendar 2017 2日目の記事になります。 今回は "Integer" みたいな文字列からその名前のクラスオブジェクトを参照する方法を書いてみます。 定義したクラスは誰が保持するのか Ruby でクラスを定義すると『そのスコープの定数』としてクラ…

【一人 Ruby Advent Calendar 2017】def や class の戻り値【1日目】

一人 Ruby Advent Calendar 2017 1日目の記事になります。 一人 Ruby Advent Calendar 2017 とは 完全に勢いで立てました。 まあなんか Ruby 界隈が盛り上がればいいかなーと まあ Ruby に関する小ネタみたいなのを簡単な書いてこうかなーと思います。 書き…

【Ruby Advent Calendar 2017】Ruby で型チェックを実装してみよう【1日目】

Ruby Advent Calendar 2017 1日目の記事になります。 Ruby 3 では静的型づけが入るとか言われていますが、今回は Ruby で動的に『型チェック』を行うコードを実装してみようと思います。 前書きという名の注意点 型チェックといいながら一般的な意味での型の…

クラス名の直後にクラスメソッドを呼び出す

本日の知見。 うーん、そこにextend書くのか…… https://t.co/298XtYmzfJ— Pocke(ぽっけ) SW-1309-2807-5790 (@p_ck_) 2017年11月18日 module Asd extend self def some_method p 'something' end end 今までこういうコードは見たことがなかったんですが、上…

Rails で hoge.foo.present? ? hoge.foo : "none" を短くしたかった

https://t.co/xgYQnFY6hO.presence || 'none'でいけそうです— Pocke(ぽっけ) (@p_ck_) 2017年10月27日 Object#present メソッドが『present? が true なら self を、そうでないなら nil を返す』という挙動になっているので、こんな感じにかけるぽい。 めち…

Nokogiri で任意の node を削除する

やりたかったので覚書。 #remove メソッドで自身を削除することが出来ます。 コード require "nokogiri" html = <<EOS <body> <div> <a></a> </div> <br> <a> <br> </a> <br> <div></div> <br> </body> EOS doc = Nokogiri::HTML.parse(html).at(:body) # 最初に見つかった <div> を消す doc.at(:div).remove puts doc puts "-" * 20 # 全</div>…

Ruby 2.5 で追加される yield_self メソッド

Ruby 2.5 では Object#yield_self というメソッドが追加される予定です。 これは以下のような実装になっています。 class Object def yield_self yield(self) end end 平たく言うと『ブロックの戻り値を返す #tap』って感じですね。 何が嬉しいのか この手の…

表参道.rb #27 での発表に一部誤りがあったので訂正と補足

発表から一週間以上経ってしまっているんですが、発表中の発言に一部誤りがあったので訂正と補足。 pattern-match を使っているコードを説明する時に 「pattern-match は using PatternMatch をすることで match と with が使えるようになり〜」 と発言して…

Ruby の #class_eval と #module_eval の違い

Ruby の #class_eval はクラスオブジェクト専用、#module_eval はモジュールオブジェクト専用のメソッドだと思っていたのですが、実は名前が違うだけで同等のメソッドだったみたい。 検証コード class C end C.class_eval { def homu end } # クラスオブジェ…

表参道.rb #27 ~ RubyKaigiのおさらい ~ で発表してきた

表参道勢でもないし、RubyKaigi にも参加していませんが、タダ飯に惹かれていろいろと思うところがあり参加&発表してきました。 発表内容は以下のような感じ。 表参道.Rb #27 pattern-match の一部を読む from pink_bangbi 内容はやきとりいさんが RubyKaig…

Ruby で xlsx を編集する

Ruby で既存のエクセルファイルを編集したかったので試してみた。 Ruby でエクセルファイルを扱う手段(gem)はいくつかあるが今回は、 .xlsx ファイルの読み込み .xlsx ファイルの書き込み セルの結合 を行いたかったので RubyXL を使うことにした。 余談 …

今更聞けない! Ruby の継承と mixin の概念を継承リストから学ぶ

Ruby を学ぶ上で継承と mixin の概念を理解することはとても重要である。 しかし、このあたりの仕組みを学ぼうとすると、include や prepend、特異クラスや特異メソッドなどという様々な機能を理解する必要がありとても複雑である。 そこで本記事は『継承リ…

Ruby でメソッドの呼び出し元の情報を取得する

例えば、次のコードのように『A.hoge の呼び出し元の情報』を取得したいことがあります。 module A def self.hoge # 呼び出し元である X オブジェクトを取得したい end end class X A.hoge end 標準の範囲だとできなさそうだったんですが、binding_of_caller…

Ruby で任意のクラスが特異クラスかどうか判定する

Ruby で任意のクラスが特異クラスか判定しなーと思ってあれこれ考えていたんですが、そもそも Module#singleton_class? がすでに存在していました。 class X end p X.singleton_class? # => false p X.singleton_class.singleton_class? # => true p X.new.s…

Ruby で内部クラスを private にする

Ruby で内部クラスを private にする場合どうするのがよいかと思っていたんですが private_constant を使うのがいいみたい。 private_constant があるのでそれを使えばそれっぽい気がします https://t.co/79ySXXyQ7l— Pocke(ぽっけ) (@p_ck_) 2017年8月8日 c…

Ruby の hook メソッド一覧

Ruby から呼ばれる hook メソッドの一覧が欲しかったので Ruby 2.4 時点で定義されているメソッドをまとめてみました。 他にもあればコメント等で教えていただけると助かります。 Class クラス #inherited クラスのサブクラスが定義されたとき Module クラス…

Ruby の (1..5) と (1...5) の違い

前者は使っていたけど、後者は知らなかかったので覚書。 範囲演算子 .. を使用した場合は終端を含み、... を使用した場合は終端を含みません。 p (1..5).to_a # => [1, 2, 3, 4, 5] p (1...5).to_a # => [1, 2, 3, 4]

Ruby の () の戻り値

Ruby だと () の戻り値は nil になるらしい。 p () # => nil p ().nil? # true ほぼ使うことはないだろうけど知らなかった(そもそも () だけ評価出来ると思ってなかった。 ちなみに #call が呼び出されるわけではない。 class X def call "call" end def fu…

Ruby で任意の異なるクラスのオブジェクトを #uniq するときの注意

元ネタ Rubyむずい…うむむむむむむむうむ[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://t.co/buooxLKDHW— 異常者 (@h1manoa) 2017年6月8日 と、いうことでちょっとやってみたら見事にハマったので覚書 元のコード class Hoge def initialize(num) @num = num end d…

RSpec で pending しても before :context が呼ばれてしまう

結果だけ先に書いてしまいますが『pending しているスコープで before :context を定義すると before のブロックが呼ばれます』。 どういうことかというと次のように before :context 内で例外が発生した場合、テストが失敗してしまいます。 describe X do #…

Ruby の Method#=== が定義されていないのでつらい問題

Method#=== が定義されていなくてつらい問題です。 Proc#=== Proc オブジェクトでは #call で評価することが出来ますが、そのエイリアスとして #=== が存在します。 upcase = proc { |a| a.upcase } upcase.call "homu" # => "HOMU" upcase === "mami" # => …

Ruby で mixin したモジュールを削除する gem をつくった

Ruby でメタプログラミングをやっているとどうしても『mixin したモジュールを削除したい』という欲求にかられるのでつくりました。 インストール $ gem install unmixer 使い方 require "unmixer" # Unmixer は refinements を使用してるので using して使…

Ruby 2.4 で refinements の制限が緩和された

さて、先日 Ruby 2.4 がリリースされました。 Ruby 2.4.0 リリース [refinements の制限を緩和] Ruby 2.4 では refinements の制限が緩和され、#send からも refine されているメソッドが呼び出せるようになりました。 class X; end module Ex refine X do d…

【Ruby Advent Calendar 2016 1日目】 Ruby でブロックを簡潔に定義する

Ruby Advent Calendar 2016の1日目の記事になります。 わたしはあまり Rails と言ったフレームワークや Ruby がよく利用されてる Web 界隈には詳しくはないので、本記事は Ruby という言語に関するネタになります。 [Ruby といえば] さて、表題のブロックで…

Ruby の Hash でキーが存在しなかった時の初期値を設定する

table = [] table[index] ||= [] table[index] << name みたいに [] で初期化するようなコードは table = Hash.new { |hash, key| hash[key] = [] } table[index] << name という風に .new に渡すブロック内で値を初期化することができる。

Ruby の正規表現でパスをいい感じに記述する

例えば、Ruby の正規表現内でパスを含む際に /^\/path\/to\/hoge.*/ みたいに書くことがあると思います。 この時にパスの / は \/ という風にエスケープして記述する必要があります。 [%r を使う] こういう時に %r を使うと綺麗に書くことが出来ます。 %r{^/…

#tap で任意の戻り値を返す

以前も書いたような気がしますが、#tap で任意の戻り値を返したい場合は break を使用します。 # #tap は通常自身を返す p 10.tap { |myself| myself + 32 } # => 10 # #tap で戻り値を返したい場合は break を使用する p 10.tap { |myself| break myself + …

Ruby の Symbol#to_proc に引数を渡す拡張

『[1,2,16].map(&:to_s(16)) みたいにかきたいよねー』というやつ。 class Symbol def call *args, &block proc { |myself| myself.send self, *args, &block } end end p [1, 2, 16].map(&:to_s.(16)) # => ["1", "2", "10"] #call を定義してこういう風に…