第9章
RubyGems
インストール済みの一覧 gem list
インストール可能な一覧 gem list -r
検索 gem search -r postgres(パターン)
インストール gem install evil-ruby
更新 gem update
おすすめのGems
rake ruby-debug active-support
ネットワーク
標準添付ライブラリ HTTP, SMTP, POP3, IMAP, FTP。より低水準の処理をするためのsocketライブラリもある。
require 'open-url'
open("http://www.oreilly.co.jp") {|connection|
connection.each_line do |line|
print line
end
}
データベースに対応するライブラリがgem形式で提供されている。
画像ライブラリ
GUIライブラリ
Continuationオブジェクト
require 'continuation' if RUBY_VERSION >='1.9'
1.upto(10) do |i|
if i == 3
$cont = callcc{|continuation|
continuation
}
end
print i, ' '
end
#cont.call(nil) if $cont
#=> 1 2 3 4 ...... 10
continutation の実行例はRubyではあまりない。
2008年10月2日木曜日
2008年10月1日水曜日
初めてのRuby (8)
第8章 オブジェクトとクラス
継承
class Duration < Range
end
インスタンスメソッドの定義
class Duration
def display; puts self end
end
duration = Duration.new
duration.display
クラスメソッドの定義
class Duration
def Duration.print(x); p x end
end
Duration.print 1 #=> 1
次の定義もある。
class Duration
def self.print(x); p x end
end
Duration.print
インスタンス化するクラスメソッドnew
class Duration
def initialize(since, till)
@since = since
@until = till
end
attr_accessor :since, :until
end
duration = Duration.new(Time.now, Time.now + 3600)
p duration.until
p duration.since = Time.new
duration.since += 10
duration.since = (duration.sinc() + 10)
クラス定義の追加
class String
def caesar; tr 'a-zA-Z', 'n-za-mN-ZA-M' end
end
puts "Learning Ruby".ceasar #=> Yrneavat Ehol
クラスの上書きの禁止 Fixnum.freeze
スーパークラスの呼び出し
class Duration
def display(targt=>$>)
super # super(target)に同じ
target.write "(#{self.since}-#{self.until})"
end
end
dusration.display
クラス変数 クラスと子孫クラスとそれらのすべてのインスタンスの間で共有
定数 クラスに属するimmutable変数
class Duration
DAYS_OF_WEEK = 7
p DAYS_OF_WEEK
def print_days_of_week
p DAYS_OF_WEEK
end
end
p Duration::DAYS_OF_WEEK
アクセス制限
public どこからでも呼び出し可能
protected クラスまたはサブクラスのインスタンスメソッドからのみ可能
private selfに対してのみ
protected privateがJava C# と意味が異なる。
特異メソッド
Singletonパターン
システム内のある種の情報を集中管理するクラスなど
CENTRAL_REPOSITORY = Object.new
def CENTRAL_REPOSITORY.register(target)
@registerd_objects ||= []
unless @registered_objects.include? target
@registerd_objects << target
end
end
def CENTRAL_REPOSITORY.unregister(target)
@registerd_objects ||= []
@registgered_objects.delete(target)
end
クラスメソッドは、Classオブジェクトの特異メソッド
class Duration
def self.a_week_from(from)
return self.new(from, from+7*24*60*60)
end
end
p Duration.a_week_from(Time.now)
特異メソッドでクラスメソッドを定義する流儀もある。
class Duration
class << self
...
モジュール
インスタンス化できないクラスのようなもの
Mix-in 制限された多重継承(Mix-inはアイスクリームの上にのせるトッピングに由来)
モジュールのincludeはちょっとした実装を複数のクラスで共有するための仕組み。
Comparableは大小比較機能をトッピングするモジュール
"an" < "and" #=> false
class Foo
include Comparable
def <=>(rhs)
# 何らかの実装
end
end
foo1 = Foo.new
foo2 = Foo.new
foo1 <= foo2 # Comaparableが提供
includeしたモジュールはクラスのancestorsメソッドで知る
String.include #=> [String, Comparable, Object, Kernel, BasicObject]
Kernelは組み込み定数や組み込み関数を保持しているモジュール
拡張部分をモジュールとしてまとめてから、include
class Numeric
include ActiveSupport::CoreExtensions::Numeric::Bytes
end
名前空間
class Service; end
module Library
class Service; end
end
最初のServiceはトップレベルの名前空間。後のは、モジュールLibraryに属している。
::Service # トップレベルのService
Library::Service # LibraryのService
メソッドの探索
・特異メソッド インスタンスメソッド includeしたモジュールのインスタンスメソッド 親クラスのインスタンスメソッド
Rubyはオーバーロードの機能はない。
内部で引数の数やクラスを調べて処理を振り分けている。
;
継承
class Duration < Range
end
インスタンスメソッドの定義
class Duration
def display; puts self end
end
duration = Duration.new
duration.display
クラスメソッドの定義
class Duration
def Duration.print(x); p x end
end
Duration.print 1 #=> 1
次の定義もある。
class Duration
def self.print(x); p x end
end
Duration.print
インスタンス化するクラスメソッドnew
class Duration
def initialize(since, till)
@since = since
@until = till
end
attr_accessor :since, :until
end
duration = Duration.new(Time.now, Time.now + 3600)
p duration.until
p duration.since = Time.new
duration.since += 10
duration.since = (duration.sinc() + 10)
クラス定義の追加
class String
def caesar; tr 'a-zA-Z', 'n-za-mN-ZA-M' end
end
puts "Learning Ruby".ceasar #=> Yrneavat Ehol
クラスの上書きの禁止 Fixnum.freeze
スーパークラスの呼び出し
class Duration
def display(targt=>$>)
super # super(target)に同じ
target.write "(#{self.since}-#{self.until})"
end
end
dusration.display
クラス変数 クラスと子孫クラスとそれらのすべてのインスタンスの間で共有
定数 クラスに属するimmutable変数
class Duration
DAYS_OF_WEEK = 7
p DAYS_OF_WEEK
def print_days_of_week
p DAYS_OF_WEEK
end
end
p Duration::DAYS_OF_WEEK
アクセス制限
public どこからでも呼び出し可能
protected クラスまたはサブクラスのインスタンスメソッドからのみ可能
private selfに対してのみ
protected privateがJava C# と意味が異なる。
特異メソッド
Singletonパターン
システム内のある種の情報を集中管理するクラスなど
CENTRAL_REPOSITORY = Object.new
def CENTRAL_REPOSITORY.register(target)
@registerd_objects ||= []
unless @registered_objects.include? target
@registerd_objects << target
end
end
def CENTRAL_REPOSITORY.unregister(target)
@registerd_objects ||= []
@registgered_objects.delete(target)
end
クラスメソッドは、Classオブジェクトの特異メソッド
class Duration
def self.a_week_from(from)
return self.new(from, from+7*24*60*60)
end
end
p Duration.a_week_from(Time.now)
特異メソッドでクラスメソッドを定義する流儀もある。
class Duration
class << self
...
モジュール
インスタンス化できないクラスのようなもの
Mix-in 制限された多重継承(Mix-inはアイスクリームの上にのせるトッピングに由来)
モジュールのincludeはちょっとした実装を複数のクラスで共有するための仕組み。
Comparableは大小比較機能をトッピングするモジュール
"an" < "and" #=> false
class Foo
include Comparable
def <=>(rhs)
# 何らかの実装
end
end
foo1 = Foo.new
foo2 = Foo.new
foo1 <= foo2 # Comaparableが提供
includeしたモジュールはクラスのancestorsメソッドで知る
String.include #=> [String, Comparable, Object, Kernel, BasicObject]
Kernelは組み込み定数や組み込み関数を保持しているモジュール
拡張部分をモジュールとしてまとめてから、include
class Numeric
include ActiveSupport::CoreExtensions::Numeric::Bytes
end
名前空間
class Service; end
module Library
class Service; end
end
最初のServiceはトップレベルの名前空間。後のは、モジュールLibraryに属している。
::Service # トップレベルのService
Library::Service # LibraryのService
メソッドの探索
・特異メソッド インスタンスメソッド includeしたモジュールのインスタンスメソッド 親クラスのインスタンスメソッド
Rubyはオーバーロードの機能はない。
内部で引数の数やクラスを調べて処理を振り分けている。
;
2008年9月29日月曜日
初めてのRuby(7)
第7章 メソッド
メソッドとは、オブジェクトに対するメッセージ送信
その他、関数的メソッドもある。
メソッド呼び出し レシーバ.メソッド名(引数)
a.some_method(1, "str")
a::some_method(1, "str") どっちも可。
メソッド連鎖 メソッドの戻り値に対してメソッドを呼ぶ(適用する)
escaped_str = str.gsub(/&/, '&').gsub(/</, '<').gsub(/>/, '>')
レシーバの省略 → デフォルトのレシーバであるselfに対してメソッドを呼び出す。
(p selfで確認)
引数を持たないメソッドのレシーバを省略すると、ローカル変数の参照と見分けがつかないが、この場合はローカル変数が優先。
関数的メソッド p Math.sin など
組み込み関数 puts p
メソッドの定義
返値は最後の評価値 、return 式では、その値。returnだけだと、nilが返る。
多値の返却
def some_method(a)
return a, 1, 2, 3
end
a, b, *c = *some_method(0)
def some_method(a)
[a, 1, 2, 3]
end
C言語におけるvoidのように値を返さないメソッドはない。返値に使い道がないメソッドの実装では最後にnilを書く人もいる。
デフォルト値
def some_method(a, b, c = 1) # cは省略可能。デフォルト値は1
end
デフォルト値の算出に式が用いられている場合、毎回その式を評価。
def print_time(time = Time.now)
p time
end
可変長引数
def some_method(a, b, *c)
p [a, b, c]
end
some_method(1,2,3,4,5) #=> [1,2,[3,4,5]]
クロージャーとしてのブロック
ブロック中の自由変数はブロックの外部環境に従う。
ブロックローカル変数
last_odd = nil
(1..10).each do |i|
last_odd = i if i%2 != 0
end
p last_odd #=> 9
ブロック付きのメソッドの定義
yield式は、メソッド内から呼び出し側のブロックをコールバックする構文。式の値をブロック呼び出し時にブロック引数として渡す。
def foo_bar_baz
yield "foo"
yield "bar"
yield "baz"
end
foo_bar_baz do |item|
puts item
end
他のブロック付きメソッドを利用してブロック付きメソッドを実装することもよくある。
def foo_bar_baz2
%w[ foo bar baz ].each do |item|
yield item
end
end
yield式はブロックの評価値を返すので、mapもどきを実装できる。
def my_map
[yeild(1), yield(2), yeild(3)]
end
p my_map {|i| i+1} #=>[2,3,4]
呼び出し側のブロックをオブジェクトして取得するには、仮引数リストの最後に&で修飾された引数を置く。この引数に、呼び出し側のブロックを表すProcオブジェクトが格納される。
class SleepyPerson
def register_handler(&handler)
@event_handler = handler
end
def wake_up!
@event_handler.call Time.now, "woke up"
end
john = SleepyPerson.new
john.register_handler {|time, message| p [time, message]}
john.wake_up!
ブロックは環境を保存するので、ブロックをProc化してためておき、後で使う。
Procオブジェクトをブロック付きメソッドに渡す。
proc = Proc.new { puts "Proc was called" }
3.times(&proc)
#=> Proc was called
Proc was called
Proc was called
メソッドとは、オブジェクトに対するメッセージ送信
その他、関数的メソッドもある。
メソッド呼び出し レシーバ.メソッド名(引数)
a.some_method(1, "str")
a::some_method(1, "str") どっちも可。
メソッド連鎖 メソッドの戻り値に対してメソッドを呼ぶ(適用する)
escaped_str = str.gsub(/&/, '&').gsub(/</, '<').gsub(/>/, '>')
レシーバの省略 → デフォルトのレシーバであるselfに対してメソッドを呼び出す。
(p selfで確認)
引数を持たないメソッドのレシーバを省略すると、ローカル変数の参照と見分けがつかないが、この場合はローカル変数が優先。
関数的メソッド p Math.sin など
組み込み関数 puts p
メソッドの定義
返値は最後の評価値 、return 式では、その値。returnだけだと、nilが返る。
多値の返却
def some_method(a)
return a, 1, 2, 3
end
a, b, *c = *some_method(0)
def some_method(a)
[a, 1, 2, 3]
end
C言語におけるvoidのように値を返さないメソッドはない。返値に使い道がないメソッドの実装では最後にnilを書く人もいる。
デフォルト値
def some_method(a, b, c = 1) # cは省略可能。デフォルト値は1
end
デフォルト値の算出に式が用いられている場合、毎回その式を評価。
def print_time(time = Time.now)
p time
end
可変長引数
def some_method(a, b, *c)
p [a, b, c]
end
some_method(1,2,3,4,5) #=> [1,2,[3,4,5]]
クロージャーとしてのブロック
ブロック中の自由変数はブロックの外部環境に従う。
ブロックローカル変数
last_odd = nil
(1..10).each do |i|
last_odd = i if i%2 != 0
end
p last_odd #=> 9
ブロック付きのメソッドの定義
yield式は、メソッド内から呼び出し側のブロックをコールバックする構文。式の値をブロック呼び出し時にブロック引数として渡す。
def foo_bar_baz
yield "foo"
yield "bar"
yield "baz"
end
foo_bar_baz do |item|
puts item
end
他のブロック付きメソッドを利用してブロック付きメソッドを実装することもよくある。
def foo_bar_baz2
%w[ foo bar baz ].each do |item|
yield item
end
end
yield式はブロックの評価値を返すので、mapもどきを実装できる。
def my_map
[yeild(1), yield(2), yeild(3)]
end
p my_map {|i| i+1} #=>[2,3,4]
呼び出し側のブロックをオブジェクトして取得するには、仮引数リストの最後に&で修飾された引数を置く。この引数に、呼び出し側のブロックを表すProcオブジェクトが格納される。
class SleepyPerson
def register_handler(&handler)
@event_handler = handler
end
def wake_up!
@event_handler.call Time.now, "woke up"
end
john = SleepyPerson.new
john.register_handler {|time, message| p [time, message]}
john.wake_up!
ブロックは環境を保存するので、ブロックをProc化してためておき、後で使う。
Procオブジェクトをブロック付きメソッドに渡す。
proc = Proc.new { puts "Proc was called" }
3.times(&proc)
#=> Proc was called
Proc was called
Proc was called
2008年9月28日日曜日
初めてのRuby (6)
第6章 変数と式
変数とはオブジェクトへの参照を保持しているもの
メソッドで、引数オブジェクトを変更すると、変更されてしまう。
→まず、複製して変更すると、元のオブジェクトに影響を与えない。
def describe(name)
name = name.dup
puts "This is a #{name}."
name[2]=?P
puts "This is a #{name}."
end
変数の種類
定数 大文字表記 CONSTANT
グローバル変数 $variable
クラス変数 @@class_variable
インスタンス変数 @instance_variable
ローカル変数 variable, _variable
グローバル変数 $stdout $: ライブラリ組み込み時の探索パス $1 最後の正規表現マッチ
定数 警告でるが、mutable
ライブラリの定数 File::RDWR File::CREAT
擬似変数 nil true false self
__FILE__ ソースファイル名 __LINE__ 行番号
慣習的制約 × PascalStyle 大文字小文字で区切る。クラス名は例外で、この方式。
incremetnt decrementはない。
多重代入 a, b, c = 1, 2, 3
a, b = b, a は可能。
a, *b = 1, 2, 3, 4, 5
p b #=> [2, 3, 4, 5]
array = [1, 2, 3]
a, b, c = *array
p a; p b; p c #=> 1 2 3
Rubyにおいて、偽とは、nil 及び falseのこと。それ以外は真。0も真。この点は、C Perl PHPと異なる。
論理積&&や論理和||はtrueやfalseではなく、オペランドのいずれかを返す。C語族とは異なる。
例 nil || 50 #=> 50
@a ||= generate_default_value @aが真なら何もせず、偽なら、generate_default_valueメソッドを呼んでそのreturn value でaを初期化する。
1..10 including 10
1...10 exlcuding 10
条件演算子
var = a ? b: c
var = if a then b else c end に同じ
制御式 値を返す。
thought = if sample.color == "green" then
"danger"
else
"undefined"
end
if式の真偽に応じてthoughtに異なる値を代入。
if ...
...
elsif ...
...
else
....
end
if修飾子 do_something if condition # endが不要
unless
(例外状況の対処)unless (通常は成立する条件)
case value
when 1 then
...
when 2,3 then
...
else
...
end
範囲分岐 正規表現による分岐もある。
===は==より緩く一致性は判定
if 0 === value then
'0'
elsif (1..9) === value then
'one keta'
else
'else'
end
case
when number.prime? then process_prime(number)
when number.fermat? then process_crmichel(number)
when number.odd? then process_odd_composite(number)
else process_even_composite(number)
endd
while condition [do]
do_something
end
do_something while condtion
後置while 最初に1回は無条件に実行
def more?
gets.chomp != 'ok'
end
begin
$stdout.print " enter 'ok' if .."
end while more?
untilもある。
for式は内部でイテレータを呼んでいる。
for nme, num in [['Jan', 1], ['Feb', 2]]
puts "#{name} は #{num}月"
end
イテレータ
loop do
puts "hello"
end
3.times {puts "Hello"} 3.times{|i| puts i}
1.upto(3) do |i| puts i end downto
脱出
loop do
puts "owari"
break if /^owari/ =~ gets
end
a = loop { break 1 }
p a #=> 1
1.upto(3) do |i|
next if i == 2 # 2ならスキップして、次の繰り返しへ
puts i
# => 1 3
例外処理
begin
do_something
rescue TypeError
..
rescue => another_error
..
else
..
ensure
.. # 例外が発生してもしなくても必ず実行
end
raise ArgumentError, 'message' ユーザーが明示的に例外を発生させるにはraise関数を使う。
大域脱出 catch throw
catch(:exit) {
loop do
loop do
throw :exit
end
end
}
#ここに脱出。
変数とはオブジェクトへの参照を保持しているもの
メソッドで、引数オブジェクトを変更すると、変更されてしまう。
→まず、複製して変更すると、元のオブジェクトに影響を与えない。
def describe(name)
name = name.dup
puts "This is a #{name}."
name[2]=?P
puts "This is a #{name}."
end
変数の種類
定数 大文字表記 CONSTANT
グローバル変数 $variable
クラス変数 @@class_variable
インスタンス変数 @instance_variable
ローカル変数 variable, _variable
グローバル変数 $stdout $: ライブラリ組み込み時の探索パス $1 最後の正規表現マッチ
定数 警告でるが、mutable
ライブラリの定数 File::RDWR File::CREAT
擬似変数 nil true false self
__FILE__ ソースファイル名 __LINE__ 行番号
慣習的制約 × PascalStyle 大文字小文字で区切る。クラス名は例外で、この方式。
incremetnt decrementはない。
多重代入 a, b, c = 1, 2, 3
a, b = b, a は可能。
a, *b = 1, 2, 3, 4, 5
p b #=> [2, 3, 4, 5]
array = [1, 2, 3]
a, b, c = *array
p a; p b; p c #=> 1 2 3
Rubyにおいて、偽とは、nil 及び falseのこと。それ以外は真。0も真。この点は、C Perl PHPと異なる。
論理積&&や論理和||はtrueやfalseではなく、オペランドのいずれかを返す。C語族とは異なる。
例 nil || 50 #=> 50
@a ||= generate_default_value @aが真なら何もせず、偽なら、generate_default_valueメソッドを呼んでそのreturn value でaを初期化する。
1..10 including 10
1...10 exlcuding 10
条件演算子
var = a ? b: c
var = if a then b else c end に同じ
制御式 値を返す。
thought = if sample.color == "green" then
"danger"
else
"undefined"
end
if式の真偽に応じてthoughtに異なる値を代入。
if ...
...
elsif ...
...
else
....
end
if修飾子 do_something if condition # endが不要
unless
(例外状況の対処)unless (通常は成立する条件)
case value
when 1 then
...
when 2,3 then
...
else
...
end
範囲分岐 正規表現による分岐もある。
===は==より緩く一致性は判定
if 0 === value then
'0'
elsif (1..9) === value then
'one keta'
else
'else'
end
case
when number.prime? then process_prime(number)
when number.fermat? then process_crmichel(number)
when number.odd? then process_odd_composite(number)
else process_even_composite(number)
endd
while condition [do]
do_something
end
do_something while condtion
後置while 最初に1回は無条件に実行
def more?
gets.chomp != 'ok'
end
begin
$stdout.print " enter 'ok' if .."
end while more?
untilもある。
for式は内部でイテレータを呼んでいる。
for nme, num in [['Jan', 1], ['Feb', 2]]
puts "#{name} は #{num}月"
end
イテレータ
loop do
puts "hello"
end
3.times {puts "Hello"} 3.times{|i| puts i}
1.upto(3) do |i| puts i end downto
脱出
loop do
puts "owari"
break if /^owari/ =~ gets
end
a = loop { break 1 }
p a #=> 1
1.upto(3) do |i|
next if i == 2 # 2ならスキップして、次の繰り返しへ
puts i
# => 1 3
例外処理
begin
do_something
rescue TypeError
..
rescue => another_error
..
else
..
ensure
.. # 例外が発生してもしなくても必ず実行
end
raise ArgumentError, 'message' ユーザーが明示的に例外を発生させるにはraise関数を使う。
大域脱出 catch throw
catch(:exit) {
loop do
loop do
throw :exit
end
end
}
#ここに脱出。
【初めてのRuby】(5)
第5章 入出力
ARGV 引数の配列
ファイル
File.open("text"){|f|
contents = f.read
print contents
} # ファイルが自動的に閉じられる
ファイルのモード
File.open("time.log", 'a'){|f|
f.puts Time.now
} # append mode
File.open("txt", File::WRONLY|File::CREAT){|f|
# do someting
}
イテレータ
File.open("txt"){|f|
f.each_line do |line|
print "#{f.lineno}: #{line}"
end
}
ARGF 引数に基づく仮想ファイル
ARGV 引数の配列
ファイル
File.open("text"){|f|
contents = f.read
print contents
} # ファイルが自動的に閉じられる
ファイルのモード
File.open("time.log", 'a'){|f|
f.puts Time.now
} # append mode
File.open("txt", File::WRONLY|File::CREAT){|f|
# do someting
}
イテレータ
File.open("txt"){|f|
f.each_line do |line|
print "#{f.lineno}: #{line}"
end
}
ARGF 引数に基づく仮想ファイル
2008年9月27日土曜日
【初めてのRuby】(4)
第4章 文字列
式展開
a =2
"aの値は#{a}" "aの5乗は#{a**5}"
"現在時刻:#{Time.now}"
バッククオート `date`
%記法
%!hoge! バックスラッシュ記法及び式展開が有効
%q!hoge! が無効
%w! hoge hogu higu! 配列
%W!hoge hogu higu! 配列。 が有効
%r!hoge! 正規表現リテラル
ヒアドキュメント
count = database_connectior.get_int(<<"EOS" % author.id)
SELECT COUNT(*)
FROM book
WHERE book.author_id = %d
EOS
EOSの前に空白文字をいれるには、 <<-'EOS'
正規表現
.*? 任意の文字列
$1
正規表現リテラル
/regexp/iu
story = << EOS
.........
EOS
story.gsub(/Solomon Grundy/, "Hippopotamus")
story.gsub.(/\w+?)day/){"#{$1}."}
"str" + "ing"
str = "str"; str << "ing"
"Look! " * 3 #=>"Look! Look! Look! "
"a,bb, ccc, ddd".split(/,\s?/) #=> ["a", "bb", "cc", "ddd"]
"string".split(//)
比較 == <
"ad" <=> "ac" #=> 1
メソッド reverse strip length
イテレータ each_line
sprintf("%04d", 3) #=> "0003"
"%04d" % 3
sprintf("%08.4f", Math::PI*10) #=> "031.4159"
"%08.4f" % (Math::PI *10)
シンボル
:if :"anna terras"
シンボルは内容が同値であれば(==)、同一オブジェクト(equal?)で、immutable
ハッシュのキーに適している。
日本語対応
$KCODE = 'SJIS'
regexp = /(.)/s SJISモードの正規表現
regexp = /(.)/n バイト列モードの正規表現
ソースファイル等はUTF-8を使用し、外部との入出力の際にだけ必要に応じてコード変換するのが普通。
メソッド encoding lenghth bytesize
マジックコメント # -*- coding: utf-8 -*-
# vim:fileencodig=UTF-8
式展開
a =2
"aの値は#{a}" "aの5乗は#{a**5}"
"現在時刻:#{Time.now}"
バッククオート `date`
%記法
%!hoge! バックスラッシュ記法及び式展開が有効
%q!hoge! が無効
%w! hoge hogu higu! 配列
%W!hoge hogu higu! 配列。 が有効
%r!hoge! 正規表現リテラル
ヒアドキュメント
count = database_connectior.get_int(<<"EOS" % author.id)
SELECT COUNT(*)
FROM book
WHERE book.author_id = %d
EOS
EOSの前に空白文字をいれるには、 <<-'EOS'
正規表現
.*? 任意の文字列
$1
正規表現リテラル
/regexp/iu
story = << EOS
.........
EOS
story.gsub(/Solomon Grundy/, "Hippopotamus")
story.gsub.(/\w+?)day/){"#{$1}."}
"str" + "ing"
str = "str"; str << "ing"
"Look! " * 3 #=>"Look! Look! Look! "
"a,bb, ccc, ddd".split(/,\s?/) #=> ["a", "bb", "cc", "ddd"]
"string".split(//)
比較 == <
"ad" <=> "ac" #=> 1
メソッド reverse strip length
イテレータ each_line
sprintf("%04d", 3) #=> "0003"
"%04d" % 3
sprintf("%08.4f", Math::PI*10) #=> "031.4159"
"%08.4f" % (Math::PI *10)
シンボル
:if :"anna terras"
シンボルは内容が同値であれば(==)、同一オブジェクト(equal?)で、immutable
ハッシュのキーに適している。
日本語対応
$KCODE = 'SJIS'
regexp = /(.)/s SJISモードの正規表現
regexp = /(.)/n バイト列モードの正規表現
ソースファイル等はUTF-8を使用し、外部との入出力の際にだけ必要に応じてコード変換するのが普通。
メソッド encoding lenghth bytesize
マジックコメント # -*- coding: utf-8 -*-
# vim:fileencodig=UTF-8
2008年9月25日木曜日
【初めてのRuby】(3)
第3章 数値
3.1 整数・浮動小数点
100_000_000
6.02e23
6.626_068_96e-34
(1.0/0.0).infinite? =>1
(0.0/0.0).nan? => true
3**5 =>245
7/0 => error
7.0/0 => Infinity
-7.dvimod(2) => [-4,1] 整除と剰余
see Integer Float Numeric
その他の数値・代数系クラス
complex rational bigdecimal matrix
3.3 比較 == != <=>
array.sort {x,y
x.some_attribute <=> y.some_attribute
}
3.4 数学関数
Math.acos(x) Math::sqrt(x) Math::E Math::PI
include Math
cos(0)
includeの使用は注意。
3.5 ビット演算 & ^ ~ << >>
整数はimmutable
a[0] ビット位置へのアクセス
多項式、超準解析、テンソルなどは外部ライブラリあり。
3.1 整数・浮動小数点
100_000_000
6.02e23
6.626_068_96e-34
(1.0/0.0).infinite? =>1
(0.0/0.0).nan? => true
3**5 =>245
7/0 => error
7.0/0 => Infinity
-7.dvimod(2) => [-4,1] 整除と剰余
see Integer Float Numeric
その他の数値・代数系クラス
complex rational bigdecimal matrix
3.3 比較 == != <=>
array.sort {x,y
x.some_attribute <=> y.some_attribute
}
3.4 数学関数
Math.acos(x) Math::sqrt(x) Math::E Math::PI
include Math
cos(0)
includeの使用は注意。
3.5 ビット演算 & ^ ~ << >>
整数はimmutable
a[0] ビット位置へのアクセス
多項式、超準解析、テンソルなどは外部ライブラリあり。
2008年9月24日水曜日
【初めてのRuby】(2)
第2章
配列とハッシュは、他のオブジェクトへの参照を保管しており、オブジェクトそのものではない。
2.1 配列
配列の構成法
c = [1, a, "str", [b,2]]
配列要素の参照
c[0] #=> 1
c[3] #=> [b,2]
※ c[3]はc.[](3)のsyntactic sugar . see Array#[]
配列の部分参照
c[1,3] #=> [a, "str", [b,2]]
c[1..2] #=> [a, "str"]
配列要素のmutation
a = [1, 2]
a[0] = 3
a[0,3] = 'a', 'b', 'c'
a[1..2] = "?"
配列は伸びたり、縮まったりする。
Array#[]= メソッド
その他配列メソッド
length size *= include? sort uniq uniq!
イテレータ each each_with_index map map sort select
ブロック付きメソッドにおける do end と{ }の使い分け
- 基本的にdo endを使い、特別な場合に{ }とある。
しかし、ブロック付きメソッドがhigher functionへの関数と考えると、
do endは非常にわかりにくい。{ } のほうがわかりやすいと思うのだが。慣れの問題か。
2.2 ハッシュ
h = { "a" => "aa", "b" =>"bb"}
メソッド each map
2.3 Enumberable モジュール
def map
result = []
self.each {item result << yield(item)}
end
Enumerator は、each以外のイテレータに基づいてEnumerableの機能を提供するクラス。
配列とハッシュは、他のオブジェクトへの参照を保管しており、オブジェクトそのものではない。
2.1 配列
配列の構成法
c = [1, a, "str", [b,2]]
配列要素の参照
c[0] #=> 1
c[3] #=> [b,2]
※ c[3]はc.[](3)のsyntactic sugar . see Array#[]
配列の部分参照
c[1,3] #=> [a, "str", [b,2]]
c[1..2] #=> [a, "str"]
配列要素のmutation
a = [1, 2]
a[0] = 3
a[0,3] = 'a', 'b', 'c'
a[1..2] = "?"
配列は伸びたり、縮まったりする。
Array#[]= メソッド
その他配列メソッド
length size *= include? sort uniq uniq!
イテレータ each each_with_index map map sort select
ブロック付きメソッドにおける do end と{ }の使い分け
- 基本的にdo endを使い、特別な場合に{ }とある。
しかし、ブロック付きメソッドがhigher functionへの関数と考えると、
do endは非常にわかりにくい。{ } のほうがわかりやすいと思うのだが。慣れの問題か。
2.2 ハッシュ
h = { "a" => "aa", "b" =>"bb"}
メソッド each map
2.3 Enumberable モジュール
def map
result = []
self.each {item result << yield(item)}
end
Enumerator は、each以外のイテレータに基づいてEnumerableの機能を提供するクラス。
2008年9月23日火曜日
【初めてのRuby】
初めてのRubyで勉強。
Windows XP ruby1.8.6
1.1 objectとは
- アイデンティを有する(unique, to know the self number and the class it belongs)
- メッセージを受け取る
---【疑問点】 メッセージを送っているのはだれか?神様か?環境か?
---【疑問点】 オブジェクト同士がメッセージを送りあい、調和のとれた状態とか、アンバランスな状態とかをつくりだすことは可能か?
- 内部状態を保つ(変数のこと?)
someobject.object_id
someobject.class
イテレータ 繰り返し実行するブロック付きメソッド(higher functionと同じような機能)
Ruby上で新たな言語を構築し、動かすのが、最近のRubyプログラミング (Ruby on Rails?)
例1-8
d.days => 3
p d.days => 3 =>nil なぜnilか?
また、p d.daysの場合、objectはどれか pは何か? メソッド?
d.days.print は、あるのか。
Rubyの機能の探し方
- 文法 組み込み関数 組み込みクラス 標準添付ライブラリの順に探す。
動的 クラスの定義は実行時 <=> 静的 C++ Java C# クラスやメソッドの定義はコンパイル時
実行時ライブラリのロード
require 'rational'
load '/path/config.rb'
command-line debuger: ruby -rdebug hello.rb
ri String ; ri File#read
インスタンスメソッド String#each_byte
クラスメソッド Time.now Time::now
1.class => Fixnum
1.methods => ["%",
Fixnum.ancestors #=> [Fixnum, Integer, ]
Fixnum.instance_methods #=> ["%", ]
Fixnum.kind_of? Class #=> true
特異メソッド 特定のオブジェクトに属するメソッド
a = "str"
def a.greet
puts "I am the object #{self.object_id}"
end
a.greet #=> I am the object 33334
大部分の演算子はメソッドのsyntactic sugar => polymorphism
1.2 + 3 #=>4.2
"str" + "ing" #=> "string"
1 <<>4
["a", "b"] << "c" #=> ["a", "b", "c"]
$stdout << "hi!" #=> hi!
Windows XP ruby1.8.6
1.1 objectとは
- アイデンティを有する(unique, to know the self number and the class it belongs)
- メッセージを受け取る
---【疑問点】 メッセージを送っているのはだれか?神様か?環境か?
---【疑問点】 オブジェクト同士がメッセージを送りあい、調和のとれた状態とか、アンバランスな状態とかをつくりだすことは可能か?
- 内部状態を保つ(変数のこと?)
someobject.object_id
someobject.class
イテレータ 繰り返し実行するブロック付きメソッド(higher functionと同じような機能)
Ruby上で新たな言語を構築し、動かすのが、最近のRubyプログラミング (Ruby on Rails?)
例1-8
d.days => 3
p d.days => 3 =>nil なぜnilか?
また、p d.daysの場合、objectはどれか pは何か? メソッド?
d.days.print は、あるのか。
Rubyの機能の探し方
- 文法 組み込み関数 組み込みクラス 標準添付ライブラリの順に探す。
動的 クラスの定義は実行時 <=> 静的 C++ Java C# クラスやメソッドの定義はコンパイル時
実行時ライブラリのロード
require 'rational'
load '/path/config.rb'
command-line debuger: ruby -rdebug hello.rb
ri String ; ri File#read
インスタンスメソッド String#each_byte
クラスメソッド Time.now Time::now
1.class => Fixnum
1.methods => ["%",
Fixnum.ancestors #=> [Fixnum, Integer, ]
Fixnum.instance_methods #=> ["%", ]
Fixnum.kind_of? Class #=> true
特異メソッド 特定のオブジェクトに属するメソッド
a = "str"
def a.greet
puts "I am the object #{self.object_id}"
end
a.greet #=> I am the object 33334
大部分の演算子はメソッドのsyntactic sugar => polymorphism
1.2 + 3 #=>4.2
"str" + "ing" #=> "string"
1 <<>4
["a", "b"] << "c" #=> ["a", "b", "c"]
$stdout << "hi!" #=> hi!
登録:
投稿 (Atom)