例えば文字列オブジェクトならstruct RStringを使うので 図2のようになる。 図2: 文字列オブジェクトの表現 オブジェクト構造体の定義をいくつか見てみよう。 ▼オブジェクト構造体の例 /* 一般のオブジェクトのための構造体 */ 295 struct RObject { 296 struct RBasic basic; 297 struct st_table *iv_tbl; 298 }; /* 文字列(Stringのインスタンス)のための構造体 */ 314 struct RString { 315 struct RBasic basic; 316 long len; 317 char *ptr; 318 union { 319 long capa; 320 VALUE shared; 321 } aux; 322 }; /* 配列(Arrayのインスタンス)のための構造体
ReFeについては http://i.loveruby.net/ja/prog/refe.html をご覧ください。 Gems版 Gemsをお使いの方は、以下のコマンドを実行する事でインストールできます。 ([ruby-list:41478]) $ gem install refe2 以下のコマンドでデータベースを構築します。 $ bitclust setup Ruby リファレンスマニュアルの検索ツール ReFe のデータ構築について 最新 Ruby リファレンスマニュアル用に ReFe のデータを構築するには以下の 手順で行います。(詳細は ReFe の README を参照してください) (1) http://i.loveruby.net/ja/prog/refe.html から ReFe の基本セット を取って来てインストールします。 tar xvzf refe-x.x.x.tar
2008-01-09 15:51:08 +0900 (1927d); rev 19 これは草稿です。 いずれ正式なところに移す予定。 対象とする読者 本稿は以下のような読者を対象にしています。 Ruby の拡張ライブラリを書いたことがない C プログラミングがそれなりにできる Ruby プログラミングがそれなりにできる 2 に関して。 「ポインタって何?」レベルの人は不可です。 構造体とポインタをちゃんと使ってプログラミングのできる人を対象とします。 3 に関して。 以下のプログラムの結果がどうなるか、 考えるだけでわかるようにしておいてください。 class C p self # 何が表示される? def C.m puts '1' p self end def m puts '2' p self end end C.m # 何が表示される? C.new.m # 何が表示される? このマニ
Perl, R, Ruby, C++ で作成したプログラムの実行速度の比較 from 2013-01-24 updated on 2013-09-30 はじめに コンピュータにやって欲しい仕事を指示するため、人はプログラムを書きます。 そのための言語にはさまざまなものがあります。目的に応じて書きやすいものを使えばよいのですが、 多量の計算が必要な場合、計算のスピードも気になります。 私自身、および私の周囲に使用者がいる言語4つ(Perl, R, Ruby, C++) で、 簡単な比較(ベンチマークテスト)をしてみました。 R ではデータの処理方法によって大きく計算時間が変わるといわれていますので、 データ構造やデータの処理法間の比較もしてみました。 なお、この結果は実行するプログラムの内容によって大きく変わりますし、 処理系によっても変わります。あくまで参考程度の情報です。 言語の選び方に
先日仕事中、一瞬の隙も見逃さずに情報収集できるRubyワンライナーとスクリプトというネタエントリを書いたのだが、その際Rubyのワンライナーをもう少しまともに理解したいと思ったので入門してみた。手元のRubyは1.9.2 はじめに Rubyのワンライナーは、rubyコマンドに色々なオプション(-eや-nなど)をつけて実行する。各オプションの網羅的な解説が見たければ、コマンドラインでは$ man rubyで閲覧できるし、webではるりまサーチで参照できる。ただ、これらは網羅的すぎるので、以下よく使うオプションとその周辺情報についてまとめた。 -e 一番基本的なオプション。スクリプトを実行する。(ちなみに他のオプションと組み合わせる時は必ず最後に記載する) 例: hogeと表示 $ ruby -e 'puts "hoge"' -n プログラム全体がwhile gets ... endというルー
コメントのご指摘のとおり Float::EPSILON は相対誤差のため、比較したい f と g の絶対値の大きな方を掛けるように比較条件式を変更しました。ご指摘ありがとうございます。 技術評論社御中。WEB+DB PRESS Vol.51 を送っていただきありがとうございます。 Vol. 51 の特集 1 は Ruby On RAILS を業務システムへ応用するノウハウ満載で、読み応えがあります。 ただ、1点だけ。以下の箇所を補足したいと思います。 浮動小数点問題 業務アプリケーションでよく問題になるのが浮動小数点です。浮動小数点の問題とは、本来0、1しか扱えないコンピュータでは一部の小数点を正確に表現できないため、計算を行ううちに誤差が生じてしまうという問題のことです。 その精度は環境によって左右されますが、たとえば筆者の環境では次のような奇妙な結果になります。 > 1.0 - 0.9
Ruby(1.8.6)で大量のデータを検索することがあったので、ハッシュと配列の検索速度はどのくらい違うのかを検証してみた。 検証用コード ※面倒なので変数名とか超適当にした。 # compare_hash_speed_with_array.rb 1 #!/usr/local/bin/ruby 2 n = 120000 3 4 a = {} 5 t1 = Time.now 6 n.times do |t| 7 a.update(t * 10000 + t => t + 123456) 8 end 9 t2 = Time.now 10 p "#{t2 - t1} sec for making hash sample" 11 12 b = [] 13 t3 = Time.now 14 n.times do |t| 15 b << [t * 10000 + t, t + 123456] 16 e
$Id: index.html,v 1.6 2004/07/20 23:08:12 aamine Exp $ この文書は書籍『Rubyソースコード完全解説』のHTML版です。 ただし初校段階の原稿をベースにしているため、 書籍では修正されている間違いが残っている場合があります。 予め御了承ください。 2004-02-16 に全章を公開しました。 目次 まえがき 序章 第 1 部「オブジェクト」 第 1 章「Ruby言語ミニマム」 第 2 章「オブジェクト」 第 3 章「名前と名前表」 第 4 章「クラス」 第 5 章「ガーベージコレクション」 第 6 章「変数と定数」 第 7 章「セキュリティ」 第 2 部「構文解析」 第 8 章「Ruby言語の詳細」 第 9 章「速習yacc」 第 10 章「パーサ」 第 11 章「状態付きスキャナ」 第 12 章「構文木の構築」 第 3 部「評価」 第
はじめに 表題のとおりでよく考えれば当たり前なのですが、ちょっとハマったので書いておきます。 要約すると、Rubyの拡張ライブラリを作る場合、用意されているALLOC()などのメモリ確保マクロを使わないときには、ちゃんと自分でGCを呼ぶ必要がある、という話です。 環境 Ruby 1.9.2p180 (2011-02-18) [i686-linux] 本題 こんなライブラリがあったとして // foo_lib.hpp #include <stdlib.h> typedef struct Foo { double bar[1000000]; } Foo; Foo* create_foo() { Foo* foo = (Foo*)malloc(sizeof(Foo)); if (foo == NULL) throw "<Memory allocation failed>"; return foo
目次 準備 まずはC言語プログラムを呼び出す 簡単な数値のやりとり NArray配列を渡す Swigを使ってお手軽変換 参考文献 準備 このチュートリアルではRuby 1.8系列の使用を前提にしています。 確認はすべてRuby 1.8.4 [i386-Cygwin]で行いました。 NArrayはVersion 0.5.8を用いています。 またそれ以外に以外に以下のものが必要です。 Cコンパイラ Rubyのコンパイルに用いたものと同じものが必要です。 バイナリパッケージを導入した場合はどのコンパイラでビルドされたものか 知る必要がありますが、UNIX系ではたいていgccです。 ruby.h, mkmf.rb Rubyをソースコードから自分でビルドした場合はインストールされていると 思いますが、バイナリパッケージを導入した場合はruby.hやmkmf.rbがあるか 確認する必要があります。開発
色々なところで見かけるコーディング規約を見て意識はしているのですが、 その時の気分で書き方を変えてしまうことが多々あったので、自戒を込めてコーディング規約をまとめてみました。 「なぜこの規約が存在するか」を明確にするために、できる限り理由も併記しています。 ただかなり主観的な部分があるので、あまり意味がないかもしれません…。 「この記事のこの規約は気に入らない。」と思うことがきっとあると思います。 その時はコメント欄などに理由も合わせて書いてくれると嬉しいです。 この記事ではRubyのコーディング規約をまとめています。 近いうちにRailsとCoffeeScriptのコーディング規約もまとめるつもりです。 Rubyのコーディング規約は以下のページを参考にまとめました。 https://github.com/styleguide/ruby https://github.com/bbatsov
新年おめでとうございます。2009年の最初のネタはプログラミングのネタにすることにしました。 Rubyについてのステキなエントリーがあったので、紹介します。 no title 私は翻訳能力がないばかりか、リーディング能力も貧相です。ぜひ、原文を読んでみてください。 はじめに Rubyのblock、Proc、lambdaはパワフルですが、解りにくい。Rubyはクロージャを使う方法が4つあって、それぞれチョットずつ違います。ここでは、そのへんを解説したいと思います。 Block もっとも簡単で、かつRubyっぽいと言えば、Blockですね。 array = [1, 2, 3, 4] array.collect! do |n| n ** 2 end puts array.inspect # => [1, 4, 9, 16] 何が起こっているか? まず、block付きでArrayの"collect
initialize は特殊なメソッドです。BookInStock.new を呼び出して新しいオブジェクトを生成す ると、Ruby はいくらかメモリを割り当て、そこに初期化されていないオブジェクトを保持します。そし て、そのオブジェクトの initialize メソッドを呼び出します。その際、newに渡された引数をすべて initialize に渡します。 class BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end end book = BookInStock.new("12345", 500) p book #<BookInStock:0x000000021e8b40 @isbn="12345", @price=500>
ruby の inject って慣れないと少し理解しづらいよなーと思ったので、極力わかりやすい説明をしてみるテスト。 わかりやすいかもしれない説明 さて、1 から 10 までの合計を求めるこんな↓コードがあった場合 sum = 0 (1..10).each {|i| sum = sum + i } p sum # => 55 inject を使ってこのよう↓に書けます。 p (1..10).inject(0) {|sum, i| sum + i } each と inject でどのように書き変わってるかを図で示すとこんな↓感じ。 injectの引数 0 は、ブロックローカルな sum 変数の初期値になってます。で、ブロックの実行結果の値が sum に代入されて、2回目以降のループを実行します。ループしている間の、各変数とブロックの中身はこんな↓感じ。 sum i ブロックの中身(sum
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く