ymaruのruby日記

2007-11-24基本文法

コメント

print "hello world\r\n" # ここはコメントです。

=begin
この中は
コメント扱いになります。
=end

変数・定数

ローカル変数

小文字([a-z])か'_'で始まる。

foobar

インスタンス変数

'@'で始まる。特定のオブジェクトに所属。

初期化していない時の値は nil

@foobar

クラス変数

'@@'で始まる。クラス定義の中で定義される。

class Foo
  @@bar = 0
end

グローバル変数

'$'で始まる。

基本的には使わない。

 $foobar

擬似変数

self, nil, true, false, __FILE__, __LINE__

定数

大文字([A-Z])で始まる。

FOOBAR

リテラル

数値リテラル
puts 255 #10進数
puts 0xff # 16進数
puts 0b11111111 # 2進数
puts 0o377 # 8進数
文字列リテラル

ダブルクォートかシングルクォートで囲む。

ダブルクォートの場合、中の文字列はバックスラッシュ記法・式展開が有効になる。

シングルクォートの場合、中の文字列の解釈は行われない。

print "hello world \\\r\n"
print 'hello world \\\r\n'
コマンド呼出し

バッククォートで囲むとコマンドを呼び出せる。

print `dir`
ヒアドキュメント

<<識別子」から「識別子」までを文字列とする。「<<」と識別子の間は空白を入れない。

<<-識別子」だと終端行をインデントできるので見栄えが良くなる。

<<'識別子'」だと文字列内のバックスラッシュ記法、式展開が無効になる。

<<"識別子"」だと文字列内のバックスラッシュ記法、式展開が有効になる。何もつけない場合と同じ。

<<`識別子`」だと文字列をコマンド実行する。

foo = <<EOS
    hello world1
    hello world2
    hello world3
EOS
print foo
配列式

配列はArrayクラスのインスタンス。

print [1, 2, 3]
ハッシュ式

Hashクラスのインスタンス。

foo = {
	'key1'=>'value1',
	'key2'=>'value2',
	1=>2
}
puts foo['key1']
puts foo['key2']
puts foo[1]
% 記法

'," を多用する場合にエスケープを減らすための記法。

'!'部分は、`(',`[',`{',`<' が使える。

  • %!STRING! : ダブルクォート文字列
  • %Q!STRING! : 同上
  • %q!STRING! : シングルクォート文字列
  • %x!STRING! : コマンド出力
  • %r!STRING! : 正規表現
  • %w!STRING! : 要素が文字列の配列(空白区切り)
  • %W!STRING! : 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効
  • %s!STRING! : シンボル。式展開、バックスラッシュ記法は無効
print %(hello\r\n) # ダブルクォート文字列
print %Q(hello\r\n) # 〃
print %q(hello\r\n) # シングルクォート文字列
print %x(dir) # コマンド出力

制御構造

if
if#
elsif#
else
   #
end
if 修飾子

右辺の条件が成立する時に、左辺の式を評価してその結果を返す。条件が成立しなければ nil を返す。

print "debug¥n" if $DEBUG  # $DEBUGが有効だったら出力する。
unless

if の逆。elsifは無い。

unless#
else
    #
end
unless 修飾子

右辺の条件が成立しない時に、左辺の式を評価してその結果を返す。

print "stop¥n" unless valid(passwd)
case
age = 12
foo = nil
ary1 = [7, 8, 9, 10, 11, 12]
ary2 = [13 .. 18]
case age
when 0, 1, 2
  foo = "baby"
when 3 .. 6
  foo = "little child"
when *ary1
  foo = "child"
when *ary2
  foo = "youth"
else
  foo = "adult"
end

print foo
while
ary = [0,2,4,8,16,32,64,128,256,512,1024]
i = 0
while i < ary.length
  puts ary[i]
  i += 1
end
while 修飾子

右辺の式を評価した値が真の間、左辺を繰り返し実行する。

while
until
until#
end
until 修飾子

右辺の式を評価した値が真になるまで、左辺を繰り返して実行する。

until
for
for idx in 1 .. 20
	puts idx
end
<<|

*** break

内側のループを抜け出す。caseは抜けない。

- while
- until
- for
- イテレータ

*** next

内側のループの次の繰り返しにジャンプする。

*** redo

ループ条件のチェックを行なわず、現在の繰り返しをやり直す。

*** retry

*** raise

例外を発生させる。

>|ruby|
raise "raise test" # RuntimeErrorを発生させる
raise SyntaxError, "invalid syntax" # SyntaxErrorを発生させる
raise # 最後の例外を再発生させる
begin

例外の補足。

resucueでエラーを省略するとStandardErrorのサブクラスの例外を補足する。


begin
	raise "runtime error"
	#raise IOError, "io error"
rescue RuntimeError
	puts "rescue RuntimeError: RuntimeErrorが発生した場合"
	print $@, ' ', $!, "\r\n"
rescue StandardError
	puts "rescue StandardError: StandardErrorが発生した場合"
	print $@, ' ', $!, "\r\n"
rescue
	puts "rescue: 上記のrescue以外(StandardErrorと同じ)"
	print $@, ' ', $!, "\r\n"
else
	puts "else: 例外未発生"
ensure
	puts "ensure: 必ず実行される"
end
rescue 修飾子
1 rescue2

式1で例外が発生したとき、式2を評価する。以下と同じ意味。StandardError以下しか補足できない。

begin1
rescue2
end
return

メソッドの実行を終了し戻り値を返す。値の省略時は nil が返る。

return
return 12
return 1,2,3
BEGIN

ファイル内の一番最初に実行されるブロック。複数あった場合は、指定された順番に実行される。

ローカル変数を共有できない。ブロックの外と情報を伝達するには定数やグローバル変数を解する必要がある。

BEGIN {
  #
}
END

後始末ルーチン。インタプリタ終了時に実行される。複数登録されている場合は、登録と逆順に実行される。

実行時に登録するので実行されない場合もある。

END {
  #
}

メソッド呼出し

クラス定数を呼び出す場合は '::' を使う。

foo.bar()
foo.bar
bar()
print "hello world¥n"
print
Class.new
Class::new

super

現在のメソッドがオーバーライドしているメソッドを呼び出す。

括弧省略時は現在の引数がそのまま渡される。引数なしの場合は super() とする。

super
super()
super(1,2,3)

ブロック付きメソッド呼び出し

イテレータと呼ばれることもある。

[1,2,3].each do |i| print i*2, "¥n" end
[1,2,3].each {|i| print i*2, "¥n" }

クラス・メソッドの定義

クラス名はアルファベットの大文字から始まる。

rescueも書ける。

class Foo < Super
  def initialize
    # コンストラクタ
  end
  def test
    # testメソッド
  end
  class Bar
    # クラスのネスト
  end
end

class Foo
  def bar
    # Fooクラスに定義を追加
  end
end

class Foo::Bar2
  # クラスのネスト2
end

モジュール定義

module Foo
  def test
     # モジュールを定義
  end
end

メソッドの定義

==, +, - など演算式も指定できる。

rescueも書ける。

def test()
 puts "hello"
end
test()

引数のデフォルト値の指定

# 引数 a のデフォルト値は 0
def test(a = 0)
 puts a
end
test
test(1)

クラスメソッドの定義


呼出し制限

  • public に設定されたメソッドは制限なしに呼び出せる。
  • private に設定されたメソッドは関数形式でしか呼び出せない。
  • protected に設定されたメソッドは、そのメソッドを持つオブジェクト のメソッド定義式内でなければ呼び出せる。
def foo           # デフォルトは private
end

class C
  def bar         # デフォルトは public
  end

  def ok          # デフォルトは public
  end
  private :ok     # …だが、ここで private に変わる

  def initialize  # initialize は private
  end
end
a=C.new
a.bar
#a.ok # これはエラーになる。

定義に関する 操作

alias

メソッド・グローバル変数に別名を付ける。

alias 新メソッド名 旧メソッド名
alias 新グローバル変数名 旧グローバル変数名
undef
undef foo
defined?

式が定義されていなければ、偽を返す。定義されていれば式の種別 を表す文字列を返す。

defined?

2007-11-23

ruby 入門

ちょっとしたツールを作るためにrubyを始めました。

ちょっとずつ覚えていこうと思います。

お奨めの本は何だろう。

↓ あたり?

よく分からないので、今度書店へ行ってみよ。

それまではWebで。

開発環境

OSWindows

欲しい機能としては、テキスト強調、入力補完、デバッグができれば良いかな。

使うと覚えないので、しばらくいいや。とりあえずメモ。