Ruby

配列から重複なしでn件をランダムに抽出

ruby リファレンスマニュアル FAQ 読む via 0から51の中から重複のない5つをランダムに選ぶにはどうしますか Ruby1.8.7以上ならArray#sample(るびまになかったので「Ruby 1.8.7での新メソッド更新(Array#choice→Array#sample) - http://rubikitch.com/に…

Ruby+WindowsでGUIプログラミング

VisualuRubyがそこはかとなく使いづらかったので、SWinを使って自前で変態的なライブラリ作ってます。 ってかSWinちょうべんり。VRubyいらないんじゃね?とりあえずできてるとこまでのご報告。 最小のスクリプト require "ruwin" Ruwin::Window.new 正方形の…

循環小数を分数に

「循環小数を分数に直す@Ruby - 簡潔なQ」が面白そうだったのでやってみた。 require "rational" def period source # [整数部, 小数部, 循環小数部]を取得する正規表現 matches = source.match(/\A(-?\d+)(?:\.(\d*)(?:\[(\d+)\])?)?\Z/) raise ArgumentEr…

下位のネームスペース内のクラスを親に持つクラスの作り方

何てわかりづらいタイトル。コード見たほうが早いです。 class Package < Class.new Base = self.superclass end Package.ancestors #=> [Package, Package::Base, Object, Kernel, BasicObject] 解説 Class.newで作成したクラスの名前は、定数に代入するま…

メタプログラミング系のrdocコメントを記述する方法と、その注意点

Rubyの得意技の一つに、メソッドを定義するクラスメソッドを使用したメタプログラミングがあります。しかし、これを利用して作ったメソッドはrdocに表示されないという問題があります。 このような場合、##によるメタプログラミング指示と、:method:/:single…

テストの共通ロジックをわかりやすく呼び出す手法

巷ではOne assertion per testなどと言われてますが、流石にアサーションを1回にするのは難しいところ。ならば共通部分を抜き出してテストを分離し、なるべくアサーションを減らす方向を取るのが現実的だと考えられます。 その際、なるべくロジックを共通化…

Ruby,Python,PHP,Perl,JavaのCodeReposコミット回数を比較してみた。

突発的に思いついたので実装してみようと思ったらRuby/SVNがバインディングだったのでPure Rubyで書いて、はてなグラフで視覚化してみた。 Perlすげえ! 説明不要ッ!ちなみにPerlを抜いたらこんな感じ。 どっこいどっこいかなー。ついでにそのsvn部分だけ抜…

StarRuby用フレームワークStarFrameをCodeReposに移動

こっそり(というか外部でも開発できるように)Google Codeに入れてたStarRuby用フレームワークStarFrameを、CodeReposに移しました。 http://svn.coderepos.org/share/lang/ruby/starframe ついでに必要性を突っ込まれてた部分をザックリ削除。サンプルはそ…

プレゼントの抽選をするスクリプトを添削してみた

F's Garage:プレゼントの抽選をするプログラムをrubyで書いてみた。で書かれているコードが面白そうだったので添削してみました。 配列のシャッフル class Array def shuffle arr = dup collect{arr.slice!(rand(arr.length))} end end F's Garage:プレゼ…

SMToolsをCodeReposにコミットしてみた

StepManiaの譜面データを操作するライブラリ、SMToolsをコミットしてみました。 「RipSynchronizer更新+「えれくとりっく・えんじぇぅ」歌詞・リップデータ公開 - こげこげ堂はてな支舗」等で公開したRipSynchronizer、「ビートで記述された歌詞ファイルを…

MemoizeモジュールをCodeReposにコミットしてみた

CodeReposへのコミッタ登録が完了しました! Yappoさん、お忙しい中ありがとうございます。 そこで、折角なので「http://d.hatena.ne.jp/isaisstillalive/20081211/1229014509」で作成したモジュールをコミットしてみました。 http://svn.coderepos.org/shar…

基数を保持した数値クラスとかどうだろう

発想元:http://d.hatena.ne.jp/tilfin/20081215/1229310421 Ruby M17Nのencodeを保持したStringみたいに、基数を保持したNumericがあれば面白いかなと思いついてやってみた。 class Integer attr_accessor :base def self.[] n, base = 10 n ensure n.insta…

Primeクラスの動作を調べてみた

Ruby1.9のPrimeクラス(素数列クラス)は以下のような面白い特徴を持っています。 「素数列」は複数存在しないのでSingletonである。 クラス自体が唯一のインスタンスと同じように振舞う。 旧Prime互換クラスのインスタンスを作成できる。 以下で個別に解説…

Memoize(メモ化)モジュールを作ってみた

素数列とかフィボナッチ数列、ルーカス数列をクラス化して遊んでたら、「メモ化部分ってモジュール化できね?」と思いついた。 色々調べてみると、(Rubyで既に実装されたものも見つかったが、)PythonのMemoizeデコレータが便利そうなのでそれを意識してみ…

Float#integer?とRational#integer?って変じゃね?

self が整数の時、真を返します。そうでない場合に false を返します。 Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。 Numeric#integer? 「クラスが整数の時」ではなく「整数の時」に真を返すなら、 require "rational" p 1.0.…

LazyArray作ってみた

ヽ( ・∀・)ノくまくまー(2008-12-02) 優しいMerbの育て方にて紹介されているLazyArrayクラス。 ソースを見たところ何故かArrayのサブクラスじゃないで、もしArrayのサブクラスとして実装してみたらどうなるかというのをやってみた。 まず初期値はブロックで…

メソッド定義でのensureは値を返せるのか!

以下のように、ensure内でreturnされた2が帰ります。 Rubyのensureはreturnを撤回できる なんと。ensureの結果が無視されるのは知ってたけど、明示的にreturnを返した場合はその値が返るんですね。これは便利! メソッドの戻り値は return に渡した値です。r…

Rubyにgotoがない理由

大域脱出としてのgotoはcatch+throwで置き換えるようになっているから。 maxnum = 9 for x in 3..maxnum do catch :not_prime do for y in 2..x - 1 handan = x.modulo(y) if handan == 0 print x puts ":素数ではありません" throw :not_prime end end pr…

算数にチャレンジしてみた

算数にチャレンジ! 第624回問題(11月20日〜 11月26日) 1〜512の数の書かれたカードが1枚ずつ、左から小さい順に、「1,2,3,4,・・・,511,512」と並んでいます。いま、次のような作業を行うことにします。ア. 前から奇数番目のカー…

ゴルフってみた

いまさらながらるびまゴルフ 【第 4 回】に挑戦してみた。 [1][n] とかしちゃうと、1 or nilしか取れないのに文字数減らないしなぁとかいろいろいじってるうちに、Integer#[nth]なんてメソッド見つけた! nth 番目のビット(最下位ビット(LSB)が 0 番目)が立…

最大値で値を制限できる数値クラスの作成

久々の日記です。最大値を制限できる数値クラスが作りたいなと思ってたらものっそいキモイのが出来上がったので公開。 値を直接変更できないのでvalue=というメソッドを使用することにしましたが、それ以外は普通の数値として扱えるはず。 require "delegate…

Rubyのsetterの戻り値がキモい件

※正確には、setterじゃなくて、代入でsetterが使用される場合の戻り値がキモい。というお話。 class Test def value= value "value" end end t = Test.new p (t.value = 10) #=> 10 p (t.value=(10)) #=> 10 p (t.__send__ :value=, 10) #=> "value" うん、…

to_iとInteger

こうすれば、 "foo".to_i2 => [0,false] "0".to_i2 => [0,true] となってくれます。 http://d.hatena.ne.jp/ytakenaka/20080802/p1 何か微妙に違和感が。 多値とは関係ない話で恐縮ですが、数値に変換できるかどうかで処理を分けたいならキャストして例外を…

なんでretryがブロックかrescue節の中でしか使えないんだろう。

RPG*1でよくありそうな「2D6を振る。ただし12の場合は振りなおし」という行動をメソッド化する場合、だいたい以下のようになると思います。 def roll begin dice = (1+rand(6))+(1+rand(6)) raise if dice == 12 rescue retry end return dice end ですが、…

引数にメソッド追加してリテラル風にするんだったら(追記)

id:takkawさんから返信を頂きました。 コメントしようかと思ったんですが長くなってしまったので、追記にしようと思ったらさらに長くなったので独立したエントリで。 特に実装側がinstance_variable_set だけで良いし。 http://d.hatena.ne.jp/takkaw/200807…

引数にメソッド追加してリテラル風にするんだったら

その後、色々考えていたらわざわざ専用クラスを作るような小難しいことは考えずにハッシュを作るようにしてそれを渡せば良いじゃん。って事に気づきました。 http://d.hatena.ne.jp/takkaw/20080721/p1 そこまでするなら、もういっその事インスタンス変数名…

要素がある場合はその値。ない場合はデフォルト値を使用

WebAPIでリクエストを取ってきてXMLから要素を取り出すときに、要素があったら〜と書くのがメンドクサイ。 doc = REXML::Document.new(xml) title = doc.elements["title"].text とかやってしまうと、〜がなかったときに nil に対して .text を行ってしまい…

メソッドの引数をわかりやすくする手法?

matrix.rb見てたら面白い表現があった。 def Vector.[](*array) new(:init_elements, array, copy = false) end 他の場所では使ってないから多分間違いなんだと思うけど、これは使えるんじゃないか? ローカル変数copyに代入した結果(=false)が返るから引…

Rubyでの多次元Hashあるいはツリーの作成法 完結篇

初期化時に末端を指定する必要性があまり感じられなかったので、なら初期化の定義を再帰させれば次元を設定する手間も省けるなーとか思って考えてみると…… def mdhash node = nil node = Hash.new{ |hash, key| hash[key] = node.dup } node.dup end /(^o^)…

Rubyでの多次元Hashの作成法

あるいは深さを指定したツリーの作成法。なんかセオリーがあるのかなと思って探してみたけど、次元数が可変な作成方法は見つからなかった。 試行錯誤しながら作ってたらなんか結構短くなったので公開。 dimension = 3 nodes = [] nodes << {} # 末端Hash (di…