rubyco(るびこ)の日記 2006年3月
このコンテンツに含まれるページ一覧
文字列リテラルクイズ
Rubyで以下のスクリプトを実行したら何が表示されるでしょうか。実行すればすぐにわかるので、特に答えは書きません。
p " #{ " p " " } " } " # } "
Permalink | コ...
Method#call
明示的にブロック引数をもらってcallする練習です。
def rubyco(c, &block)
print c
block.call(block) if block
print c
end
rubyco('*') { rubyco('^') } #=> *^^*
block_given?とyieldで実現した場合。
de...
$SAFE
変数$SAFEを1以上に設定すると、外部からのtaintedなデータを使った危険な処理ができなくなります。
以下では、環境変数経由でのevalがエラーになっています。
ENV["SECRET"] = "put...
alias
メソッド名をaliasすると、メソッドに別名をつけることができます。別名といっても定義をシェアしているわけではないようです。元のメソッドを再定義しても、別名の側の...
pp
ppを使うとプリティプリントができます。
require 'pp'
a = {
"Bobby" => 19,
"Elvis" => 19,
"Grimm" => 19,
"Fredy" => 19,
"Haris" => 13,
"David" => 13,
}
b = {
"Alice" => 13,
"Chris" => 16,
}
people = [ a, b ]
p people
pp p...
Segmentation fault
Segmentation faultが出てしまいました。
Windows XP
標準入力がNULデバイス
STDIN.tty?
#!行なし
.rbはrubyに関連づけ
C:\temp> assoc .rb
.rb=rbFile
C:\temp> type 1.rb
STDIN.tty?
C:\temp> type 2.rb
re...
[am]エラトステネスの篩
Rubyで「エラトステネスの篩」を実装しました。単純な版♪
def sieve(m)
prime = (0..m).to_a
(2..m).each do |p|
next if not prime[p]
yield(p) if block_given?
(p+p..m).step(p) do |k|
prime[...
Mutex
Mutex#lock, Mutex#unlockとbegin ... ensure ... endでクリティカルセクションを作りました。
require 'thread'
M = Mutex.new
def normal(c)
10.times {
print '.'
sleep rand(nil) / 10
}
end
def critical(c)
c = c.upcase
M.l...
Regexp.escape
Regexp.escapeを使うと、正規表現で特別な意味を持つ文字を\でエスケープしてくれます。Regexp.quoteも同じです。
以下は、正規表現で特別な意味を持つ文字の一覧を表示す...
Struct
Structクラスを使って、構造体クラスを作ることができます。
構造体クラスには自動的にアクセサが作られます。
以下のプログラムでは、Peopleというクラスを作っています。...
文字列リテラルとobject_id
Rubyの文字列リテラルは、評価するたびに新しいオブジェクトが作られます。
object_idを調べればそのことが確認できます。
a = 'hello'
b = 'hello'
c = 'hello'
p a.o...
rjust, ljust
rjust, ljustでは、文字列を右寄せ、左寄せにします。
p "Rubyco".rjust(40)
p "Rubyco".rjust(40, ".")
p "Rubyco".ljust(40)
p "Rubyco".ljust(40, ".")
実行結果です。
" Rubyco...
FEEDBRINGER
「FEEDBRINGER.netというサイトで、この「rubyco(るびこ)の日記」が日間・週間・月間の人気フィードになっている」と教えていただきました。見てみますと、日間1位・週間1...
send
Object#sendメソッドは、メソッド呼び出しを行うメソッドです。
class Rubyco
def self.hello(name)
puts "Hello #{name}!"
end
end
Rubyco.hello('Alice') #=> Hello Alice!
Rubyco.send(:hello, 'Alice') #=> He...
method_added with callcc
Module#method_added, Module#method_removedを使うと、メソッドの追加(定義)と削除を監視できます。
class Rubyco
def self.method_added(sym)
puts "method_added(#{sym})"
end
def self.method_removed...
ρヒューリスティック
大きな数の因数を発見的に求めるρ法(Pollardのρヒューリスティック)をRubyで実装しました。
# 2個の素数の積を因数分解する
def factor_two(given)
start = Time.now
one =...
ブロックはProc
ブロックとして渡されてくるのはProcオブジェクトです。proc { } や lambda{ }もProcオブジェクトです。ただ { } と書くとHashオブジェクトですね。
def p_block(&block)
p block.cl...
Array.newとブロック
初期値を定めるために、Array.newにブロックを与えることができます。
a = Array.new(7) do |i|
(?A + i).chr
end
p a #=> ["A", "B", "C", "D", "E", "F", "G"]
上と同じことは、以...
イテレータ変換
内部イテレータを外部イテレータに変換します。
あ、えーと、一言で言えばeachをnextに変換するということです。
each-ableなコレクションを渡してIteratorオブジェ...
Bindingと継続の類似性
bindingで作った「もし再帰の深みで評価したら」のサンプルを見ていて、「《Binding》って《継続》と似ているところがあるのでは?」と思いました。その「似...
nilとfalse
Rubyの「偽」はnilとfalseだけです。
p !!nil #=> false
p !!false #=> false
でも、nilとfalseは等しくありません。
p (nil == false) #=> false
Permalink | コメント(0)
0と""
Rubyでは...
Errno
errno のリストもほしいと書かれていたので調べてみました。
プラットホーム固有のOSのエラー一覧は、Errno.constantsで得ることができます。
require 'pp'
pp Errno.constants
実行結果で...
callerとalias
callerとaliasを使うと、異なる名前で呼ぶとそれに応じた処理を行うRubyメソッドが作れるという話題がありました。なるほどです。
Permalink | コメント(0)
SIGALRM
眠いので...
cryptの使い方
前もってcryptで作っておいた結果(saved_secret)を、次回はsaltとして使います。
実際にはsaltは乱数を使います。
password = "PaSsWoRd"
salt = 'Ru'
saved_secret = password.crypt(salt) #=...
Complexクラスと!のついたメソッド
Complexは複素数です。
require "complex"
c = Complex(1, 2)
p c #=> Complex(1, 2)
p c.real #=> 1
p c.image #=> 2
p c.arg #=> 1.10714871779409
p c.polar ...
Marshalでdeep copy
Object#dupはshallow copyですけれど、Marshal.dumpとMarshal.loadでdeep copyになります。
a = ["A", ["B", "C"]]
# dup - shallow copy
b = a.dup
p a == b #=> true
p a.object_id == b....
Class.new
Class.newを調べようと思ってri Class.newしたら以下のように怒られてしまいました。
私の理解ではClass.newとClass::newはほぼ同じで、メソッドのときには . を使い、定数の時には...
!が着いたメソッド探し
ObjectSpaceを使って、!が着いたメソッド探しをしましょう!(これは感嘆符)
name = Array.new
ObjectSpace.each_object(Class) do |c|
c.instance_methods(false).each do |mname| # super not in...
標準出力のリダイレクト
IO#reopenを使うと、リダイレクトができます。
以下のプログラムでは、標準出力をoutput.txtというファイルにリダイレクトしています。"a"を使っているので...
変数$?とtexpdf.rb
texpdf.rbは、pLaTeXPDF変換をするバッチファイル的なスクリプトをRubyで書いたものです。
目次生成のためにplatexを二回走らせるのですが、何らかのエラーが起こってp...
String#sum
String#sum(bits=16)は単純なサムチェックを取るメソッドです。引数はビット数。
疑問:ri sumには「the sum of the binary value of each character in _str_ modulo +2n - 1+」と書いてありますが、...