Ruby

Rubyの間違いやすいけど、重要な問題募集中

Ruby言語の選択式問題を生成するCUIアプリrcertを作っています。プログラムの方は、だいたいできてきたのですが、問題の方があまりないので、募集中です。

Ruby技術者認定試験(シルバー)練習アプリrcertの更新

実施日、読み込んだファイル、間違えた問題などのレポートを書き出すように修正しました。 動画 ソースコード

Ruby技術者認定試験(シルバー)のような試験を生成するアプリを公開しました

Rubyに関する選択式の試験が作れるCUIアプリrcertをgithubに公開しました。資格試験に興味がなくても、間違いやすいメソッドなどの問題を作っておいて、一日のはじめにやれば、ミスが減って開発が早くなるかもしれません。と言っておきたいと思います。 デモ…

2種ある範囲演算子の暗記方法

範囲演算子は'0..10'と'0...10'があります。どっちかが10を含んで、どちらかが10を含まないんですが、さぁこれをどう暗記しようかなという話です。使用頻度が高い方をおぼえたら、消去法でどちらの意味も分かるのですが、なんとなく範囲演算子ってあまり書い…

Engine, Applicationはクラスメソッドの呼び出しに失敗した場合は、インスタンスメソッドを実行する

railsアプリのconfig.ruを見ると"run XXX::Application"となっていて、でもRails::Applicationにはcall(env)がなくてってので、どうして動くのか理解できませんでしたが、ソースコードを見ると class Railtie autoload :Configurable, "rails/railtie/config…

ctrl+cでrackサーバーをシャットダウンする

Rack.version == 1.1で、 require 'rack' Rack::Handler::WEBrick.run HelloRack.new, :Port => 9292 とするとctrl+cでサーバーがシャットダウンできないので、次のように書き換えてシャットダウンできるようにしています。 rackアプリは設定ファイル(hello.…

Validations#validatesの簡易版を実装

ActiveSupport::(Callbacks, Concern)のいい加減なのができたので、validatesのいい加減なのを作ってみました。

複数のモジュールにあるStaticeMethodsを1つのクラスのクラスメソッドにまとめる

1つ前までのConcernではうまくいかないので修正。これでほぼrailsのConcernと同じです。 解説 まずMとM2はConcernをextendしたときに@dependenciesが定義されます。"include M"で、M.append_feachers(M2)が呼ばれます。M2は@dependenciesをinstance variable…

callbacksの簡易版を実装

いやぁ、Ruby on Rails Guilds:Get Startedをやってみて、validationまわりがどうなっているのか気になったので読んでみました。validatesはActive SupportのCallbacksモジュールのset_callbackでValidatorオブジェクトがvalidateをコールするのをvalid?を実…

1つのモジュールの中で特異メソッドとインスタンスメソッドを定義して、クラスに引き渡す方法

active supportを使うと、次のようになります。 require 'active_support/concern' module M extend ActiveSupport::Concern def method2 puts "method2" end module ClassMethods def method1 puts "method1" end end end class C include M end C.method1 …

Rakeを実装してみました

rubyのライブラリの再実装シリーズ第二弾。第一弾はunit/testでした。なんか、文章書くのも大変なので、githubにmyrakeという名前で公開しました。commitはこまめにしているので、最初のcommitから読んでいけば開発の追体験?ができます。現在のところRakefil…

optparseを使ってみた

ARGVとOptionsParserの仕様を以下のコードで確認してみました。ARGVはOptionParser#parse!するとオプション分はシフトするみたいですね。 $ ruby --version ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] #!/usr/bin/env ruby require "test/uni…

MiniTest::Assertionsはモジュールであることについて考えてみた

『初めてのRuby』によると、モジュールは拡張機能(または名前空間など)に使われる習慣があるようです。例としてNumericクラスがRailsではモジュール(ActiveSupport::CoreExtensions::Numeric::Bytes)で拡張されているのが紹介されています。MiniTest::TestCa…

電子書籍:Ruby標準ライブラリの再実装(test/unit)を公開

最初から順に読んでいけば"test/unit"が分かることを目標にしたドキュメントを書いています。epub形式のみで最新版はここに公開しています。対象読者はRuby初心者で、分量も短いです。"test/unit"はコンセプトというか、どんな感じのものを書こうとしている…

意図しないメソッドの上書きを防ぐテクニック

Rubyには意図しないメソッドの上書きを防止する方法があります。このテクニックは例えば、既にあるクラスに独自拡張を加えるときなどに有効です。既に定義されているクラスをAとし(Aが例えばStringの場合では既に定義されています。Aのままの場合は、既にク…

unit/test(1ファイルの場合)

Rubyでテスト駆動開発するのはとても簡単です。test/unitをrequireして、TestCaseを継承したclassをファイルに作って実行するだけです(テストメソッドは多分"test_"で始まる必要がある)。test/unit.rbの方でテストの実行が記述してある(test/unit.rbの最後の…

特殊変数$!

るりまサーチによると最後に発生した例外が$!に入るそうです。 #!/usr/local/bin/ruby puts "$! = #{$!}(#{$!.class})"#=>"$! = (NilClass)" begin raise "test" rescue puts "$! = #{$!}(#{$!.class})"#=>"$! = test(RuntimeError)" end puts "$! = #{$!}(#…

ブロック付きメソッド

Rubyを今日から触りはじめてます。test/unitを見ててat_exitというブロック付きメソッドを見つけたので、動作を確認してみました。 #!/usr/local/bin/ruby $wasrun = false def say_hello_once at_exit { puts "hello, world!" }unless $wasrun $wasrun = tr…