Ruby

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 本体をビルド ファイルローカルなトッ…

rbenv をインストールしたので覚書

今まで めんどくさかったので rbenv を使っていなかったのですが Ruby 2.5 をインストールする為に入れたのでその覚書。 rbenv とは?みたいなことは以下の記事を参照してください。 rbenvとは?(rbenvを利用したRubyのインストール) - Qiita 事前準備 す…

【一人 Ruby Advent Calendar 2017】Ruby 2.5 がリリース!!【25日目】

一人 Ruby Advent Calendar 2017 25日目の記事になります。 今日で最後!! Ruby 2.5 がリリース!! Ruby 2.5.0 リリース 直前にいろいろとあったようですが、無事リリースされました。 コミッタの皆さんお疲れ様でした。 Bundler の標準入りは延期 Ruby 2.…

【一人 Ruby Advent Calendar 2017】キーワード引数や Hash の渡し方や受け取り方いろいろ【24日目】

一人 Ruby Advent Calendar 2017 24日目の記事になります。 Ruby 3.0 でキーワード引数をぶっ壊すらしいのですが、現状の仕様をよく理解していないので簡単にまとめてみようかと。 Hash を渡す時に {} を省略 引数の最後が Hash 値の場合、{} を省略して書く…

【一人 Ruby Advent Calendar 2017】Ruby で外部ファイルを読み込むメソッドいろいろ【23日目】

一人 Ruby Advent Calendar 2017 23日目の記事になります。 今回は require などの外部ファイルを読み込むメソッドを簡単にまとめてみます。 Kernel.#require 引数の Ruby のライブラリを読み込みます。 ここでいう Ruby のライブラリとは、 Ruby のスクリプ…

【一人 Ruby Advent Calendar 2017】Ruby の % 記法【22日目】

一人 Ruby Advent Calendar 2017 22日目の記事になります。 そろそろラストスパート % 記法 Ruby には % 記法という特別なリテラルがあります。 例えば、%w という記法を使うと以下のように『空白文字で分割した』文字列の配列として定義されます。 p %w(hom…

【一人 Ruby Advent Calendar 2017】ginza.rb で Ruby 2.5 の話を聞いてきた【21日目】

一人 Ruby Advent Calendar 2017 21日目の記事になります。 ちょっと話が前後してしまいますが、火曜日にginra.rb に初参加してきたのでそのまとめを。 今回は Ruby 2.5 のおさらいということで Ruby 2.5 の機能を参加者全員で眺めて生きながら意見を言って…

【一人 Ruby Advent Calendar 2017】トップレベルの変数の扱い【19日目】

一人 Ruby Advent Calendar 2017 19日目の記事になります。 前回、トップレベルのメソッドの扱いについて書いたのですが、今回は変数に関してです。 トップレベルのローカル変数 トップレベルで定義されたローカル変数は通常のローカル変数と同じような感じ…

【一人 Ruby Advent Calendar 2017】トップレベルメソッドの扱い【18日目】

一人 Ruby Advent Calendar 2017 18日目の記事になります。 Ruby でトップレベルに定義したメソッドがどういう扱いなのかイマイチわからなかったので調べてみた。 トップレベルの self まず、トップレベルの self ですが、これは main という特別なオブジェ…

【一人 Ruby Advent Calendar 2017】module_function について【17日目】

一人 Ruby Advent Calendar 2017 17日目の記事になります。 #module_function とは #module_function は任意のメソッドを『モジュール関数』として定義するための Module のインスタンスメソッドです。 #module_function は以下のように module 内で使用しま…

【一人 Ruby Advent Calendar 2017】` メソッドで外部コマンドの実行結果を取得する【16日目】

一人 Ruby Advent Calendar 2017 16日目の記事になります。 遅れてしまいすみません。 Ruby の ` メソッド Ruby では外部コマンドを呼び出す手段がいくつかあるんですが、以下のように ` メソッドを使用することで `{command}` の結果を戻り値として取得する…

【一人 Ruby Advent Calendar 2017】Ruby の &. 演算子【14日目】

一人 Ruby Advent Calendar 2017 15日目の記事になります。 今回は Ruby 2.3 で追加された &. 演算子(ぼっち演算子)について紹介します。 &. 演算子 &. 演算子はメソッド呼び出し(.)の代わりに使用できる演算子です。 obj&.hoge と呼び出した場合 obj が n…