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で指定した文字数をカウントします。 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#[]を使うと、ビットパターンが得られます。 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__と$0との比較」を「このスクリプトが直接実行されたかどうか」の判断に使うというイディオムがあります。以下に例を示します。 class Greeting def initialize(name="Rubyco") @name = name end d…
「self.メソッド」と「メソッド」という式は等価ではありません。プライベートメソッドの場合、「self.メソッド」の形式(レシーバ.メソッドの形式)では呼び出せないからです。 puts "Rubyco" #=> Rubyco self.puts "Rubyco" #=> private method `puts' cal…
一番外側(トップレベル)のselfは何でしょう。 p self #=> main p self.class #=> Object同じことを今年の2月にも考えていました。
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します。 p ["Alice", "Bobby", "Chris", "David"].join(',') #=> "Alice,Bobby,Chris,David"
簡単な計算をしてみます。 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です。 p "123" + "456" #=> "123456" p "123".to_i + "456".to_i #=> 579
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:>
methodsメソッドで、そのオブジェクトのメソッド名のリストが得られます。ということは、次のようにすると、nilのメソッド名のリストが得られます。 puts nil.methods.sort実行結果です。 & == === =~ ^ __id__ __send__ class clone display dup eql? equal…
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を知っています。 class Rubyco def initialize(you) @you = you end def hello puts "Hello, #{@you}!" end attr_accessor :you end r = Rubyco.new("Alice"…
String#eachで区切り文字列を指定すると、その区切り文字で区切ります。区切り文字は残ったままです。 s = "Alice,Bobby,Chris,David" s.each(",") do |w| puts w end実行結果です。 Alice, Bobby, Chris, David
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.[]もメソッドなんだから、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, …
配列同士の & をとると、集合の積になります。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メソッドで、そのオブジェクトのメソッド名のリストが得られます。 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 }
Windowsマシンをリニューアルしたらrefeがどっかいっちゃったので再インストール。 以下の手順でインストールができました。 1. ActiveScriptRubyをインストール > ruby -v ruby 1.8.4 (2005-12-24) [i386-mswin32] 2. RubyGemsからrubygems-0.9.0.zipをダウ…