2006-11-01から1ヶ月間の記事一覧

コンマ区切りの文字列を逆順に

コンマ区切りの文字列を逆順にします。splitしてreverseしてjoinすればよいですかね。最後のコンマはなくなります。 s = "Alice,Bobby,,David,Elmo," p s.split(/,/).reverse.join(',') #=> "Elmo,David,,Bobby,Alice" p s #=> "Alice,Bobby,,David,Elmo,"cf…

平均値

ときどきの雑記帖 リターンズを見て、私も書いてみました。 srand(314159) data = Array.new(10) {|k| rand(100) } p data average = data.inject(0.0) {|sum, item| sum + item } / data.length puts "average = #{average}"to_fを使わないで出来るかな、と…

String#count

String#countで指定した文字数をカウントします。 require 'pathname' p "Hello, Rubyco!".count('o') #=> 2 ('o'は2個ある) p 'こんにちは, るびこさん.'.count('こ') #=> 12 (日本語うまくいかないらしい) p Pathname.new('a.rb').read.count("\n") #=> 5 …

.[]で呼び出す

[ ]もメソッドなので、レシーバ.[](引数)のように書けます。 p 1024.[](10) #=> 1

Integer#[]

Integer#[]を使うと、ビットパターンが得られます。 10.downto(0) do |k| print 1024[k] end #=> 10000000000きのう定義した(機能定義じゃなくて、昨日定義ね)Method#whereを使って、[]がどこで定義されているかを調べてみましょう。 class Method def whe…

正規表現にマッチした文字列を得る変数$&

小さなプログラムで正規表現の練習をします。 参照:『新版Perl言語プログラミングレッスン入門編』(p.191) while s = gets if /ca.s/ =~ s puts "=> #{$&} --- Matched!" else puts "=> Not matched..." end end実行例です。 cats => cats --- Matched! CAT…

擬似変数__FILE__

擬似変数__FILE__は現在のソースファイル名です。 「__FILE__と$0との比較」を「このスクリプトが直接実行されたかどうか」の判断に使うというイディオムがあります。以下に例を示します。 class Greeting def initialize(name="Rubyco") @name = name end d…

self.メソッド

「self.メソッド」と「メソッド」という式は等価ではありません。プライベートメソッドの場合、「self.メソッド」の形式(レシーバ.メソッドの形式)では呼び出せないからです。 puts "Rubyco" #=> Rubyco self.puts "Rubyco" #=> private method `puts' cal…

一番外側のself

一番外側(トップレベル)のselfは何でしょう。 p self #=> main p self.class #=> Object同じことを今年の2月にも考えていました。

putsはどこで定義されているか

putsはどこで定義されているのでしょう。 表示してみればすぐ分かります。ObjectクラスがインクルードしているKernelモジュールで定義されているようです。 p method(:puts) #=> #<Method: Object(Kernel)#puts>クラスで定義されているのか、モジュールで定義されているのかを区別するのは</method:>…

配列の添字

コンマを使って[初めの要素,長さ]と書けるとは知りませんでした。 a = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G' ] p a[1] #=> "B" p a[1, 4] #=> ["B", "C", "D", "E"] p a[1..3] #=> ["B", "C", "D"] p a[1...3] #=> ["B", "C"]

配列への代入

配列への代入の際、添字が範囲になっていると、その範囲が置換されます。つまり、添字の範囲がいったん削除され、その位置に要素が挿入されます。 添字が範囲になっているときにnilを代入すると単なる削除になります。a[0]へnilを代入したときと、a[0..0]へn…

配列の和と積

和(|)や積(&)を使うと、重複要素を簡単に削除できますね。 a = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] p a #=> [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] a |= a p a #=> [3, 1, 4, 5, 9, 2, 6, 8] b = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] p b #=> [3, 1, 4,…

joinメソッド

joinメソッドは、joinします。 p ["Alice", "Bobby", "Chris", "David"].join(',') #=> "Alice,Bobby,Chris,David"

Fixnum→Floatへ

簡単な計算をしてみます。 price = 2000 p price #=> 2000 p price * 0.9 #=> 1800.0 price = 10000 p price #=> 10000 discount_price = price * 0.9 p discount_price #=> 9000.010000に0.9を掛けると9000ではなく、9000.0になります。両者の違いを.class…

Stringの和

String + StringはStringです。 p "123" + "456" #=> "123456" p "123".to_i + "456".to_i #=> 579

16進数表

0〜255の16進数表です。 (0..15).each do |high| (0..15).each do |low| printf("%X%X ", high, low) end puts end実行結果です。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 …

メソッドがどこで定義されているか

putsはどこで定義されているかを踏まえて、メソッドがどこで定義されているかを無理矢理求めてみます。 class Method def where to_s =~ /#<Method: (\w+)(\((\w+)\))?#/ if $3 return $3 else return $1 end end end module Rubymod def m end end class Rubyco include Rubymod def c end end r = Rubyco.new p r.method(:m).where #=> "Rubymod" p r.method(:c).where #…</method:>

nilで使えるメソッド名一覧

methodsメソッドで、そのオブジェクトのメソッド名のリストが得られます。ということは、次のようにすると、nilのメソッド名のリストが得られます。 puts nil.methods.sort実行結果です。 & == === =~ ^ __id__ __send__ class clone display dup eql? equal…

methodメソッド

methodメソッドを使うと、メソッドオブジェクトを得ることができます。得るメソッドは名前で指定します。 p 1.method(:nil?) #=> #<Method: Fixnum(Kernel)#nil?> p nil.method(:nil?) #=> #<Method: NilClass#nil?>得たメソッドのアリティ、文字列表現、呼び出しは以下の通り。 p nil.method(:nil?).arity #=> 0 </method:></method:>…

methodで得たメソッドオブジェクトはselfを知っている

methodメソッドを使うと、メソッドオブジェクトを得ることができます。得たオブジェクトは元のselfを知っています。 class Rubyco def initialize(you) @you = you end def hello puts "Hello, #{@you}!" end attr_accessor :you end r = Rubyco.new("Alice"…

String#eachで区切り文字列指定

String#eachで区切り文字列を指定すると、その区切り文字で区切ります。区切り文字は残ったままです。 s = "Alice,Bobby,Chris,David" s.each(",") do |w| puts w end実行結果です。 Alice, Bobby, Chris, David

Arrayでの負の添字

Rubyでは、負の添字は配列末尾から逆方向にたどった要素に対応します。-1が末尾の要素、-2は末尾から2番目、-3は末尾から3番目。 ar = ['Red', 'Green', 'Blue'] p ar[-4] #=> nil p ar[-3] #=> "Red" p ar[-2] #=> "Green" p ar[-1] #=> "Blue" p ar[ 0] #=…

Array.[]というメソッド

ふと気がついた。Array.[]もメソッドなんだから、methodメソッドでメソッドオブジェクトにできるよね。 m = Array.method(:[]) a = m.call('Red', 'Green', 'Blue') p a #=> ["Red", "Green", "Blue"]Array.newもね。 m = Array.method(:new) a = m.call(5, …

Array#&で集合の積

配列同士の & をとると、集合の積になります。refe "Array#&" 参照。 以下では2の倍数twosと3の倍数threesの積をとって、6の倍数を得ています。 twos = [] threes = [] (0..10).each do |k| twos << 2 * k threes << 3 * k end p twos #=> [0, 2, 4, 6, 8, 1…

methods

methodsメソッドで、そのオブジェクトのメソッド名のリストが得られます。 puts 1.methods.sort実行結果です。 % & * ** (略) __id__ __send__ abs between? ceil chr class clone coerce (略) to_s to_sym truncate type untaint upto zero? | ~

何が表示されるか?

何が表示されるか? ObjectSpace.each_object(Object) {|o| if o == o.class p o end }

Gems版ReFeインストールのまとめ

Windowsマシンをリニューアルしたらrefeがどっかいっちゃったので再インストール。 以下の手順でインストールができました。 1. ActiveScriptRubyをインストール > ruby -v ruby 1.8.4 (2005-12-24) [i386-mswin32] 2. RubyGemsからrubygems-0.9.0.zipをダウ…