子クラスには定数も継承される

へぇと思ったのでメモ。親クラスで定義された定数は、子クラスにも継承されて修飾なしで参照できる。 クラス名も定数なので、それも出る。 class Hoge ABC = 123 class Fuga end end class Foo < Hoge p constants #=> [:ABC, :Fuga] end なんだか変な感じで…

モジュールを継承したモジュールを作りたかった話

Hogeモジュールを継承したFugaモジュールを作ろうとしたらエラーになった。 module Hoge def self.hoge # 特異メソッド puts "hoge!!!" end end module Fuga < Hoge def self.hoge # 特異メソッド puts "fuga!!!" super end end Fuga.hoge SyntaxError: (irb…

evalよりinsntance_variable_setのほうが10倍速かった話

コンストラクタで、インスタンス変数を初期化する際に引数があればそれを、なければデフォルト値を入れたかった。 class Hoge attr_accessor :foo, :bar, :baz DEFAULT = { :foo => 'foo', :bar => 'baz', :baz => 'baz', } def initialize(opt = {}) DEFAUL…

クラスインスタンス変数

メタプログラミングRubyに書いてあったことメモ。 class Hoge 〜 end の間に地の文で書かれている@の変数は「クラスインスタンス変数」と呼ばれるらしい。 class Hoge @p = 123 @@p = 234 end # クラスインスタンス変数 puts Hoge.instance_variable_get(:@p…

Proc.newとlambdaの違い

自分用まとめ。 結論 lambda使っておけば問題ない。 Kernel#procは? 1.8だとlambdaと同じ動きをする。 1.9だとProc.newと同じ動きをする。 使う必要ない。 違いその1 return lambda内でのreturnは、メソッドのdefと同じ動きをする。分かりやすい。 lambda …

Procとlambdaは[]でも呼び出せる

.callだけだと思ったら[]でも呼び出せるらしい。http://www.ruby-doc.org/core-1.9.3/Proc.html -> { puts "lambda!" }[] #=> "lambda!" Proc.new { puts "Proc!" }[] #=> "Proc!" rspec/core.rbのrequireがそうなってて、見たときびびった。

includeだけでincludeとextendする方法

読んでます。メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見るその中でMerbを例に「クラス拡張…

ローカル変数をスコープ内側へ

Perlだとこれは動く。 my $outer = 123; sub hoge { print "$outer\n"; } hoge(); #=> 123 Perlは内側への変数スコープは有効だからだ。 対してRubyは動かない。 outer = 123 def hoge puts outer end hoge() #=> NameError: undefined local variable or me…

XMLを解析してハッシュにするベンチマーク

XMLをハッシュにしたかったのだけれど、やり方がいろいろあるらしくって計測してみた。 NokogiriのXPath NokogiriのSAX REXMLのpull-perser REXMLのstream REXMLのSAX2 参考: http://d.hatena.ne.jp/tohtas/20091101/1257092607 http://d.hatena.ne.jp/wine…

やったーRuby技術者認定Gold受かったよー\(^o^)/

一週間くらい公式教科書読んで、受けてきました。75%で合格のところを、76%でした。なんというボーダー。 あと1問間違ってたら落ちてた。 とはいえ合格は合格なので、ありがたく履歴書の資格欄などに書かせていただこうと思います。 で、この資格試験なんだ…

Classはincludeできない

class Hoge; end class Fuga include Hoge end test.rb:4:in `include': wrong argument type Class (expected Module) (TypeError) from t.rb:4:in `<class:Fuga>' from t.rb:3:in `<main>'</main></class:fuga>

クラスを再オープンすると元のインスタンスも影響を受ける

# クラスを作る 1.9.3-p194 :001 > class Hoge 1.9.3-p194 :002?> def hoge 1.9.3-p194 :003?> "hoge-----!!!!" 1.9.3-p194 :004?> end 1.9.3-p194 :005?> alias :fuga :hoge 1.9.3-p194 :006?> end => nil # インスタンスを作る 1.9.3-p194 :007 > h = Hoge…

参考書読んで覚えたこと雑記

rescue HogeError で、HogeErrorクラスを継承しているクラスの例外ならそれもキャッチされる。(よく考えたらrescue Exceptionが全部拾うなぁ) コマンドラインオプション c:文法チェック、w:警告モード、r:指定ファイル実行、d:デバッグモード、W:すべて警…

Ruby技術者認定試験Gold受けることにした

あと10日くらいで買ってきた参考書読んでトライ!

be_[predicate]マッチャ

ローカルの勉強会に行ってきた。ブログを書くまでが勉強会です。RSpec の入門とその一歩先へ - t-wada の日記(旧)Rspec入門を上記ページに沿ってペアで書いた。 2時間いかないくらいでは、第1イテレーションしか進まなかった。「お」と思ったのは、be_[pre…

継承先の子クラスの呼び方が分からない

Perlだとこうなるのは、Rubyだとどうなるのか。 package Hoge; sub new { my $class = shift; bless {}, $class; } sub fuga { my $self = shift; my $class = ref $self; "$class\::Fuga"->new; } package Piyo; our @ISA = ('Hoge'); package Piyo::Fuga; …

Rubyレシピブック050〜053途中

050 文字列をバイトごとに処理する 割愛 051 文字列を連結する なお、短い文字列を大量に追加する場合は、+ではなくString#concatを使うべきです。 なるほど。 Perlは「.」の文字列連結演算子一択だけれど、Rubyは用途によって使い分けが必要らしい。 参照先…

Yokohama.rb #22 に行ってきた

2012/7/14(Sat)に行われたYokohama.rbに行ってきた。 誰も書いてないみたいなので書いておく。 http://bukt.org/events/49 ちなみに勉強会なるものに初めて参加した。 PerlerなのにRubyの方が先とはこれいかに。 17:00開始だと思っていたら17:30開始だった …

YAML.loadの例外補足がわからない

"RuntimeError occur at here!!!"の例外はどこにいってしまったのでしょう。

タイトルを「PerlerのRuby日記」から「Perlerによるプログラミング雑記」に変更しました。

Youtube検索

WEB+DB PRESS Vol.44より、MVCの解説としてYoutubeから検索するプログラムをPerlで例として掲載されていたのをRubyで書き直してみた。WEB+DB PRESS Vol.44作者: 鵜飼文敏,ミック,はまちや2,小飼弾,萩本順三,角田直行,きたみりゅうじ,小田慎一郎,河合太郎,大…

クラスの階層

練習も兼ねて簡単なフレームワークを作っていて以下のように書いたらエラーになった。 lib/myapp/controller/search/index.rb class Search::Index < Controller … end uninitialized constant Object::Search (NameError)まだまだよく理解しきっていないの…

多重ループからの脱出

単純なループやイテレータは、breakで脱出できる。 num = [1,2,3,4,5,6,7,8,9,10] num.each do |i| break if i > 5 puts i end puts "----------------------" for i in num break if i > 5 puts i end 1 2 3 4 5 ---------------------- 1 2 3 4 5ただしこ…

=~ による正規表現パターンマッチ

正規表現は、正規表現クラスつまりRegexpクラスから作るか、「/regexp/」のようにスラッシュで囲むかで作れるけれど、まあ後者が簡単。 test_regexp = Regexp.new('^test', true) #=> /^test/i test_regexp = /^test/i #=> /^test/i マニュアルには左辺に正…

ヒアドキュメント

Rubyのヒアドキュメント。 「 「 「区切り語」をダブルクオートで括れば式展開される。シングルクオートならされない。 「区切り語」を裸に書けば、ダブルクオートと同じ扱い。 ただし、明示的に書いておいた方が可読的に良い。 「 最終的に、文字列末尾に改…

Ruby on Railsインストール

RubyGems を利用して流行の Ruby on Rails をインストール。 Ruby on Rails インストール $ gem install rails Successfully installed activesupport-3.0.2 Successfully installed builder-2.1.2 Successfully installed i18n-0.4.2 Successfully installe…

インストール

サクラレンタルサーバにRubyをインストールした手順。 現在最新版はRuby1.9.2。 レンサバなのでもちろん管理者権限はなく、ホームディレクトリにインストール。 ちなみにbash。 Ruby $ cd ~/src $ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.…

Ruby日記

Rubyについて学いだことを主に私的メモとして記録していく。