Ruby

Kernel.send :define_method

method_missing やだなーと思ったので、似たことをやる別解を describe "Kernel.send :define_method & send例" do class Calc2 def initialize yield self if block_given? end def defun(key, &block) Kernel.send :define_method, key.to_sym do |*args| …

block を後で評価 & method_missing の練習

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る上の本を読みながら、研修向け Rubyイディオム…

学習ログ class method

class A def A.class_method_one; "Class method"; end def self.class_method_two; "Also a class method"; end class <

学習ログ transpose

transposeで行列の入れ替えができる. numbers = [1,2,3] lowers = [:a, :b, :c] uppers = [:A, :B, :C] flags = [true, false, true] [numbers, lowers, uppers, flags].transpose.map{ |n, l, u, f| { :number => n, :lower => l, :upper => u, :flag => f…

学習ログ group_by

(1..30).to_a.shuffle.group_by { |n| n <= 10 ? "1..10" : n <= 20 ? "11..20" : "21..30" } # 実行結果例 #{ "1..10"=>[2, 5, 8, 1, 10, 6, 9, 7, 3, 4], # "11..20"=>[14, 15, 20, 16, 11, 12, 18, 19, 13, 17], # "21..30"=>[26, 24, 29, 23, 28, 21, 22…

Code Golfに参加してみた

http://golf.shinh.org/p.rb?Compound+interest a,b,c=gets.split(":").map{|i|i.to_i};(1..a).inject(b){|r,i|p r;r+r*c/100} みんなどうやってんだ??

メモ. Hash#merge

irb(main):015:0> {:aa => "aa", :bb => "bb" }.merge({:cc => "cc", :bb => "new_bb"}) => {:cc=>"cc", :aa=>"aa", :bb=>"new_bb"} 設定をハッシュで行うケースでハッシュのmergeメソッドを見かけた. イディオムっぽい.設定のデフォルト値(例:{:aa => "aa…

Ruby Codeを調べて、defやclassのロケーション情報をYAML形式で保存

http://jp.rubyist.net/magazine/?0009-YAML を参考に.YAMLの練習.YAMLは、後で、名前からメソッドやクラスへ移動する際に利用する. どんなYAMLフォーマットで保存しようか考えるのは、面白かった. 配列は、indexを自動にふってくれる 配列は、indexを使…

コールバック

昨日Rails勉強会に久しぶりに参加した.Observerパターン. コールバックしたい時に、きっちり型を出さないならブロックだろうなぁと思った。 その場で試したくなったがノートを持たない私. ノートがほしくなった. class Counter def initialize @count = 0 @l…

メルマガねた

ブロック先をモックにしてBehavior Verification. ブロックだと無名のメソッドになるから、名前の「do」が重要じゃなくなる。 class StringToSortedIntArrayFilter def run(message) yield(message.split(",").collect{ |node| node.to_i }.sort) end end de…

メルマガねた.代替案

(0..23).reject { |hour| hour == 9 or hour == 18 }.each { |hour| ... }全体を囲むのもありか.... class Greeting def say return "hello!" if Time.now.hour == 9 return "good bye!" if Time.now.hour == 18 "hay!" end end describe Greeting, "at …

結局、UI部分をモジュールをクラスに置き換えた.

前回までモジュールだったUI部分をクラス化して、injectするように. いつもの見慣れた構造.こっちのほうが読みやすいし、テストし易い. Spyというキーワードを使ったのは、Test Spy at XUnitPatterns.comを参考に. set_uiよりinject_uiを使ったのは、師…

open module による置き換え

コラボレーションテストで、テスト対象のクラスにincludeされたメソッドをモック化する際 Dependency Injectionでやろうとするのはなんか手間だなと思って、前回はテスト対象のクラスに手を加えて逃げた. 今回は別解でオープンモジュール??(オープンクラ…

RSpec学習

RSpecのソースを参考に、練習で書いたspec. どちらかというと、全体のパスを通すテストだが、GUI部分はメソッドオーバライドで逃げた. Ruby + RSpecだと it shouldの部分が、かなり簡潔にかける。 3〜4行に収めようとするフォースをRSpecに感じとれた!! r…

eval使わないなら、こんな感じ?

配列が頑張るなら、こんな感じ? [target_dir]. select_recent. reverse[0..7]. delete_current_file. collect_view_paths. open_menu 微妙かなw require File.dirname(__FILE__) + '/open_from_menu' include Mate::OpenFromMenu module Mate module OpenRe…

最近のファイルを開くを書き直し

既に現在開いているやつが候補にあがっても困るなと思って. わーっと書いていたところがあったので書き直してみた. require File.dirname(__FILE__) + '/open_from_menu' include Mate::OpenFromMenu module Mate module OpenRecent def open_recent(targe…

TextMateでRSpecを扱う設定

TextMateに RSpec操作を簡単にするBunldleがあるんだが、どうしても、specソースとlibソース間を簡単に行き来するコマンドが使えなかった. 今日、ようやく使えるようになった。以下に設定の覚え書き. ~Library/Application\ Support/TextMate/Bundles/以下…

復習

だめだ,ちゃんと英語勉強したほうがいいなぁ。 describe Array, "is empty" do before do @array = end it "should have 0 items" do @array.should have(0).items end it "should not find and result is nil when condtion is [e == 'node1']" do @array.…

uriとopen-uri

require "uri" require "open-uri" open(ARGV[0]) { |f| puts URI.extract(f.read, %w[http]) }

ねむてぇ

タイトルとは関係ないですがSlideShareっていいですね. The Top 10 Reasons The Ruby Programming Language Sucks

めも

def src false inText EOS end def parent_recusive(node) return unless node.parent return unless node.parent.name "#{parent_recusive(node.parent)}/#{node.parent.name}" end require 'rexml/document' doc = REXML::Document.new src paths = [] doc…

REXML学習めも take4

def src EOS end require 'rexml/document' doc = REXML::Document.new src doc.each_recursive{ |e| puts "element_name=>#{e.name}" e.attributes.keys.each{ |att| puts " attribute_name=>#{att}" } } 教訓 APIはirbでメソッドを調べて、こねてみること …

REXML学習めも take2

def src EOS end def collect_all_elements(results, parent) return unless parent results #{n.name}" n.attributes.keys.each{ |att| puts " attribute_name=>#{att}" } }

REXML学習めも

def src EOS end def parse_children(results, parent) return unless parent parent.elements.inject(results){|re, e| re #{n.name}" n.attributes.keys.each{ |att| puts " attribute_name=>#{att}" } } element_name=>Hoge attribute_name=>y attribute_…

RubyKaigi2007 2日目

おおとりは、Dave Thomasの基調講演. 内容はここでは特に触れません. 日本 Ruby 会議 2007 - Log0610-S5などをご覧ください. 私の感想を. 胸が熱くなりました。正直、こんな気持ちにさせられるとは思っていもいませんでした. 今は、Rubyの飛躍のときで…

今日は生のDave Thomasに!!

もっと、プログラム書かなきゃ!

めも 「,」

[ :a, :b, :c, ].each { |b| puts b } :c直後に 「,」があってもOKであることを会社の人に教えてもらった.ちょっとうれしい。 ペアプロすると色々発見がある.

RSpec1.0.0を入れてみた

http://rspec.rubyforge.org/documentation/rails/index.htmlインストールは簡単。 gem install rspec ドキュメントを写経してみた # officer_spec.rb require 'officer' describe "All Employees", :shared => true do it "should be payable" do @employee…

Fizz Buzz take2

会社の先輩に教えてもらって、別のアプローチ。 p (1..100).map{|x| s = "#{'Fizz' if (x % 3).zero?}#{'Buzz' if (x % 5).zero?}"; s.any? ? s:x}

Fizz Buzz

一人でFizz Buzzと口に出してみたが、この言葉遊びゲーム、難しそうだ。 何も見ずだと100まで言えそうにない なので、Macにしゃべらせた。 (1..100).to_a.map{|x| if (x%3==0 && x%5==0) then "FizzBuzz" elsif (x%3==0) then "Fizz" elsif(x%5==0) then "Bu…