難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ:若手エンジニア/初心者のためのRuby 2.1入門(12)(1/4 ページ) オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Rubyの「黒魔術」といわれるメタプログラミングの概要、self、特異メソッド、特異クラス、オープンクラス、モンキーパッチなどの使い方をコード例を交えて解説します。
![難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ](https://cdn-ak-scissors.b.st-hatena.com/image/square/bbbea82045795ebee7aa3ba9c53db35fde1383c4/height=288;version=1;width=512/https%3A%2F%2Fimage.itmedia.co.jp%2Fait%2Farticles%2F1501%2F06%2F240_news028.jpg)
「計算機プログラムの構造と解釈」で末尾再帰というものを知ったので勉強しました。自分の理解を書いてみます。 再帰 再帰呼び出しとはある手続きの中で、再びその手続き自身を呼び出すことと定義される1。でもこの定義は正確じゃない。なぜなら再帰呼び出しは自分自身を呼んでいないからだ。 階乗を考えてみよう。階乗は数学的にこう定義できる。 ふつうRubyで階乗メソッドはこう書く。 factメソッドの中でfactメソッドが呼ばれているので、自分自身が呼ばれているように見える。でもそうじゃない。 最初の引数5を受け取ったfactメソッド(彼をfact5と呼ぼう)は、引数4と共に自分が呼んだfactメソッド(fact4)の結果を待たなきゃならない。なぜならその結果と5をあとで掛けなきゃならないからだ。fact4もfact3もfact2も同じだ。自分が呼んだメソッドの結果を待たなきゃならない。 人間が待ちながら
161227: 内容が古くなったので、書き直しました。 はじめに# Ruby 開発環境を整えようとおもったが, 普段よく使っている Eclipse を出すにはスクリプト言語は大げさだ. スクリプト言語はコンソール端末で書くに限る. というわけで, Emacs 使いなあたしとしては, Emacs での Ruby 環境を整えようとおもった. いろんなサイトを参考にしつつ, 導入したものを列挙していく. 準備# elip 取得に必要な package.el や el-get.el, git や wget などのツールはインストール済みのこと. 環境# Emacs 24.3.1 Ruby 2.1.0 優れた IDE の条件# 優れた IDE が備えるべき機能は以下 シンタックスハイライト/ インデント ruby-mode 検索・置換 iedit, multiple-cursors, helm-ag
『Homebrewのemacsをeditしてインラインパッチなどを当てる(Emacs-24.3)』が2013年11月4日現在21もストックされていて驚いているのですが、最近は以下のようなemacs.rbを使っています。まだgithub:h12o/homebrewにはpushしていない(というわけなのでgithub:mxcl/homebrewにpull requestしていない)emacs.rbなのですが、gistにでも登録しますので、少しでもお役に立てれば幸いです。 require 'formula' class Emacs < Formula homepage 'http://www.gnu.org/software/emacs/' url 'http://ftpmirror.gnu.org/emacs/emacs-24.3.tar.gz' mirror 'http://ftp.gnu.
こんな風に使える。 puts "filename: #{__FILE__} 似たようなのに $0 がある。 しかし $0 と __FILE__ は似て非なるもの。 __FILE__ が実行中のプログラムのファイル名を表すのに対し、 $0 は実行するときに指定したプログラムのファイル名を表す。 > ruby hoge.rbのように実行するプログラムが1つの場合は、 __FILE__ と $0 の値は一致する。 しかし、別のプログラムから require したときは、 __FILE__ と $0 は一致しない。 この特徴を利用して、 __FILE__ と $0 はライブラリのサンプルコードによく利用される。 例えば以下のようにして書けば、 ライブラリとして利用されるとき(require されて使われるとき)は サンプルコードの部分は実行されない。 if __FILE__ == $0 # サンプ
ruby(26) html(0) Ruby/TK(1) Shoes(1) Ruby-GNOME2(1) wxRuby(1) QtRuby(29) FxRuby(1) VisualuRuby(vruby)(15) VisualuRuby(vruby)の目次(1) WideStudio/MWT(1) rails(5) winXP(1) console2(1) msys(1) rsense(1) 設定ファイルをYAML形式で作成し、ruby標準添付ライブラリであるyamlを使い設定ファイルデータの読み込み、書き込みをします #以下の設定ファイルconfig.ymlを作成 #config.yml-------------------- --- music: title: twist&shout singer: paul mails: - northern.songs@example.jp - no
Rubyでプログラム書くにあたって、bundlerを使わないプログラムは1年ぐらい経つと動かなくなってる事が多々あって、bundlerマジ重要なのと ぐぐってもあまりbundlerの利点や説明がまとまってる記事がなかったので 研究室のwikiに書いた記事を転載しておく。 Bundlerとは Bundler: The best way to manage a Ruby application's gems プロジェクト内で使うRubygemsを管理するしくみ。 プロジェクトの一番上のディレクトリに「Gemfile」というテキストファイルを置き、その中にgemの名前(と必要あればバージョンも)書く。 % bundle install というコマンドで、gemが一括インストールできる プログラム内で require 'bundler' Bundler.require と書くと、gemが一括req
要は、テーブル間のリレーションを操作する仕組みね アソシエーションを使えば、こんなデータ取得が、 @book = Book.find(1) @reviews = Review.where(:book_id => @book.id) こんな風に書ける @book = Book.find(1) @reviews = @book.reviews で、このアソシエーションで特に大事なのは、命名規則! 外部キー列は、「参照先モデル_id」の形式(book_idみたいな) 中間テーブルは参照先テーブルを「_」で、辞書順に連結(authors_booksみたいな) belongs_toは、単純な関連ね こんな感じで、review.rbに書く class Review < ActiveRecord::Base belongs_to :book end と、言いながら、実はScaffoldで「referen
お久しぶりです。この1ヶ月、フィリピンでは地震あり、台風ありと、厳しい天災に見舞われ、僕もこの1ヶ月で2度ほどセブへ足を運びましたが、幸いにも大きな被害はなく無事に営業を続けることができております。 色々とご心配していただいた方々、お心遣い誠にありがとうございました。ただ、近隣の島々では、非常に根深い被害がありますので、フィリピンに会社を持つ我々として、何かできることを考えていきたいと思っております。 次期開発に向けてエンジニアを募集。 さてさて、ラングリッチも去年の夏に東京オフィスを構えてから、早いもので1年が経過しましたが、お陰様で無事に営業を続けております。 そんな中、秋頃から新しい事業もスタートし、来年に向けて開発がなお活発になるため、ここらで僕らと一緒に開発をしてくれるエンジニアを募集したいと思います。 というわけで、まずは会社の特徴を紹介します。 ラングリッチは『オンライン英会
RSpecの標準マッチャー(matcher)の一覧を作ってみました。できるだけ一覧を見やすくして、開発の手助けになることを目指しています。 🚜 RSpecって何?RSpecのベーシックな情報は以下がお勧めです。 「RSpec をもっと理解したかったので、まとめを作りました」に感動してRuby 1.9.3でやってみた! : 以前作ったものです。RSpecの導入の手助けになると思います。 改めて学ぶ RSpec : RSpec初歩からしっかり理解できるすばらしい記事です。 RSpec 簡潔に記述する(1) it ブロックを短く書く! : 説明がすごくわかりやすくて勉強になります。 🐡 マッチャー一覧 マッチャー not 意味・機能
というように書くようになりました。 別にshouldを使った記法がなくなったわけではありませんが、 https://github.com/rspec/rspec-expectations のREADME.mdには、もう新しいSyntaxの説明しか載っていないし、今後はexpectの方を使っていくほうがいいでしょう。 http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax には、新しいSyntaxを導入した背景が説明されています。 簡潔に書くと、shouldだとBasicObjectを継承したクラスのテストを書くときに不具合が起こるみたいですね。 移行方法 基本 基本的には、上に書いたように、 foo.should を expect(foo).to に foo.should_not を expect(foo).
実際に実行した例が以下になります。 month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] wrong_number = [0, 1, 2, 3, 4, 5, "6", "7", 8, 9, 10, 11] wrong_number.each do |num| begin puts month[num] rescue => ex puts ex.message break end end 後処理 例外が起こった場合と起こらない場合の両方で実行したい処理がある時はensureを使います。 begin <例外を発生させる可能性のある処理> rescue => <変数> <例外が起こった場合の処理> ensure <例外の有無に関わらず実行される処理> end 実際に
🐰 目次(1)RSpec はじめの一歩 (2)stackクラスとstackクラスのRspec (3) before/after (4) matcher(マッチャ) (5) カスタムマッチャ (6) サンプルソース(GitHub) 🎂 (1)RSpecはじめの一歩we use RSpec to #describe Behaviour of a system using Examples of how #it should work. 「#itがどのようにworkするか」を例にして、システムの 振る舞い(動作)を説明するためにRSpecを使う From [Ruby][Rails] RSpec をもっと理解したかったので、まとめを作りました RSpecの導入の説明には一番マッチします! 🚕 (2)stackクラスとstackクラスのRSpec次のstackクラスをテスト対象とします。 cl
分かりやすいページがなかったのでメモっとく。 基本 "文字列" =~ /正規表現/ 基本はこれだけで、マッチすれば特殊変数に結果がセットされ、しなければnilが返る。 $` マッチした箇所の前 $& マッチした箇所 $' マッチした箇所の後 "Hello Regular Expression." =~ /Regular/ print "#{$`}<<#{$&}>>#{$'}" # Hello <<Regular>> Expression. Perlライクに$1〜9で、グループ化した箇所を取得できる。 "Hello <b>Regular</b> Expression." =~ /<b>(.*?)<\/b>/ print $1 # Regular (.*?)としているのはデフォルトでできるだけ長い文字列とマッチしようとするからで、指定しないと同じタグが複数ある場合に思った結果にならなかった。
RSense を用いて,Emacsでのrubyのコーディング時の自動補完とリファレンスの表示を行います. 完成図はこんな感じ. 環境 OSX Snow Leopard (10.6.8) Emacs 23.4.1 ruby 1.8.7 事前準備 Java Runtime Environment (JRE) 1.5あるいはそれ以降のバージョンが必要.OSXの場合は,最初からインストールされているはず.auto-complite-modeと連携するようにするので,事前にインストールが必要. ダウンロード 本家からダウンロード.今回は,2012.5.7時点で最新版のrsense-0.3.tar.bz2をダウンロード. 適当な場所で展開する.自分は,.emacs.d/opt/内に展開した. インストール rsense-0.3内へ移動する.まず実行権限を付与する.
RubyでSVMのライブラリ"liblinear-ruby-swig" liblinearについての詳細は割愛(詳細は本家サイトにて) liblinearをrubyで使うために、以下のライブラリを用いて行いました。 ・liblinear-ruby-swig 簡単な使い方を紹介します。 require "linear" # types = [ 'L2R_LR', 'L2R_L2LOSS_SVC_DUAL', 'L2R_L2LOSS_SVC', 'L2R_L1LOSS_SVC_DUAL', 'MCSVM_CS', 'L1R_L2LOSS_SVC', 'L1R_LR' ] SVMの種類 # 0:L2_LR , 1:L2LOSS_SVM_DUAL , 2:L2LOSS_SVM , 3: L1L1LOSS_SVM_DUAL, 4: MCSVM_CS, ... 定義されている変数名 pa = LPar
隣の同期がRails4!Rails4!とうるさいので、Rails4.0.0.beta1に移行してみた。 Ruby を 2.0.0 にしてみる。 Ruby 1.9.2を使ってたんですが、Rails 4 は Ruby 1.9.3以降じゃないとだめだよーとのこと。 で、Ruby 2.0.0 が推奨されてるらしいので、この機会に 2.0.0 にしてみた。 # cd /usr/local/src # wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.bz2 # tar xvf ruby-2.0.0-p0.tar.bz2 # cd ruby-2.0.0-p0 # ./configure --prefix=/usr/local/ruby200p0 # make # make install # mv /usr/bin/ruby /us
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く