トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

Ruby はじめに



目次



記事一覧

キーワード

Ruby はじめに

[Ruby][Perl]

http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb

 演算

http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html

四則演算(整数、浮動小数点数)

puts 1+2
puts 1.0/3.0
べき乗
puts 2**10 
剰余
puts 10 % 3 
絶対値
puts ((1-3).abs) 
乱数
puts rand
puts rand(11) # 0-10
乱数 Seedを使う
srand 999
puts rand
Math
puts Math::PI
puts Math::E
puts Math.sqrt(5)
puts Math.log(100)
puts Math::E**Math.log(100)

各種演算
puts 'hello' + ' world'  # 文字列の足し算
puts '0' * 4             # 文字列の掛け算 0000 
puts 0.to_s * 4          # 数値->文字列変換
puts '9'.to_i * 2        # 文字列->整数変換
puts 1.to_f / 3.to_f     # 整数->浮動小数点数変換 

標準入力 gets(tring)
puts gets

末尾の改行を除く chomp
puts 
val = gets.chomp
puts '<-- ' + val + ' -->

演算子もメソッド
puts 1.+ 1

文字列メソッド
puts 'hello'.reverse
puts 'hello is ' + 'hello'.length.to_s + ' chars.'
puts 'abcd'.upcase
puts 'ABCD'.downcase
puts 'abcd efg'.capitalize

センタリング、左寄せ、右寄せ
puts '0123456789' * 2
puts 'hello'.center(20)
puts 'hello'.ljust(20)
puts 'hello'.rjust(20)



 配列

dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
puts dates[0]
puts dates[1]
puts dates[2]

sortメソッド
dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
dates2 = dates.sort
dates2.each do |date|
	puts date
end

 ハッシュ

has = {}
has['one'] = 1
has['two'] = 2
has['three'] = 3

puts has['one']

 制御

http://www.ruby-lang.org/ja/man/html/_C0A9B8E6B9BDC2A4.html#unless

比較

  • 比較演算子
puts 1 > 0.5
puts 0.5 == 0.5
puts 1 != 1.0

  • ショートサーキット
c1 = true
c2 = false

def chk1
  c2 = true
  return true
end
def chk2
  c1 = false
  return false
end

if chk1 || chk2
  puts true
end
puts c1.to_s + "," + c2.to_s

分岐

if
t = gets.chomp.to_i
if t < 12
  puts 'good moring.'
else
  if t == 12 
    puts 'good afternoon.'
  else
    puts 'good evening.'
  end
end
  • elsif
a = true
b = false
c = true
if a and b and c
  puts "all true"
elsif a or b or c
  puts "any one or more true"
else
  puts "all false"
end
unless

ifと逆の条件判定

c1 = false

unless c1
  puts "c1 false"
else
  puts "c1 true"
end

case
def greet(hour)
  case hour
  when 5 .. 11
    msg = "morning"
  when 12
    msg = "afternoon"
  when 13 .. 20
    msg = "evening"
  else
    msg = "night"
  end
  return "good " + msg
end

puts greet(22)

繰り返し

for
ary = ['a','b','c','d']
for c in ary
  puts c
end

while
s = gets.chomp;
while s != 'q'
  puts s
  s = gets.chomp;
end

eachメソッド
dates = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
dates.each do |date|
	puts date
end

timesメソッド
3.times do
	puts 'hello'
end

 例外

例外を発生
  • ランタイム
def foo
  raise "Runtime Error!"
end
foo

  • 文法
def bar 
  raise SyntaxError.new("invalid syntax")
end
bar

例外処理
  • begin、rescue、else、ensure
def foo(x , y)
  begin
    ret =  x / y  
  rescue ZeroDivisionError
    ret = nil
  else
    ret = nil
  ensure
    
  end
  return ret
end
puts foo(100, 0)

 メソッドの作成

def greeting time
  if time < 12
    puts 'good moring.'
  else
    if time == 12 
      puts 'good afternoon.'
    else
      puts 'good evening.'
    end
  end
end

greeting 12

戻値
def greeting time
  msg = ''
  if time < 12
    msg = 'good moring.'
  else
    if time == 12 
      msg = 'good afternoon.'
    else
      msg = 'good evening.'
    end
  end
  msg #メソッドからの返り値は単純にメソッドの最後の行の値
end

puts greeting(21)

不定個の引数を渡す

「*」を使う

def prtPrms(*prms) 
  for p in prms
    print p, " "
  end
end

prtPrms(1, 2, 3)

特異メソッド
  • 特異メソッドは特定のインスタンスに固有のメソッド
class Foo
end

f = Foo.new
def f.hello
  puts 'hello.'
end
f.hello

クラスメソッド
class Foo
 def Foo.name
   puts 'foo'
 end
end

Foo.name

ブロック付きメソッド
def foo
  puts "pre process."
  yield
  puts "post process."
end

foo { puts "main process." }

Webページ取得例

require "open-uri"
open("http://typea.info", :proxy => 'http://proxy:8080') { |uri|
  puts uri.read
}

テキストファイル表示例

File.open("C:\\test.txt") {|file|
  while w = file.gets
    print w
  end
}

 変数

http://www.ruby-lang.org/ja/man/html/_CAD1BFF4A4C8C4EABFF4.html
種類 書式 スコープ
ローカル変数 小文字または、'_'ではじめる 宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでで
インスタンス変数 @ではじめる インスタンス変数はそのクラスまたはサブクラスのメソッド。特異メソッドから参照不可
クラス変数 @@で始める クラスの特異メソッド、インスタンスメソッドなどから参照/代入
グローバル変数 $ではじめる プログラムのどこからでも
定数 大文字ではじめる 定数が定義されたクラス/モジュール定義の中。再代入で警告

  • メンバー変数 class Hoge
  def sayName
    puts @name
  end
  def giveName name
    @name = name #@をつける
  end
end

h = Hoge.new
h.giveName('foo')
h.sayName

  • 定数
CONST_VALUE = 'constant'     #大文字ではじめる
CONST_VALUE = 'change value' #warning
puts CONST_VALUE

 クラス

クラスの拡張

組み込み整数クラスを拡張してみる

  • 同じクラスを再定義すると、前のクラス定義に追加されていきます。
  • メソッドを再定義した場合には後のものが上書きしますので、前のものは失われます。

class Integer
  def to_chinese 
    s = self.to_s

    cs = ['零', '壱','弐','参','四','伍',
          '六', '七','八','九']

    ret = ''
    i = 0
    while i < s.length
      ret += cs[s[i ,1].to_i]
      i += 1
    end 
    return ret
  end
end

puts 123456.to_chinese

クラスを作る
class Hoge
  def sayName
    puts "hoge"
  end
end

h = Hoge.new
h.sayName

アクセッサ

メンバー変数はpublicにはできない。
アクセッサを定義するか、attr_reader、attr_writer、 attr_accessorを使う

class Foo
  def initialize(name, age)
    @name = name
    @age = age
  end
  
  attr_reader :name
  #以下と同じ
  #def name
  # return @name
  #end
  
  attr_accessor :age
end
f = Foo.new('Foo', 12)
f.age = 20
puts f.name + ' ' + f.age.to_s

initialize メソッド

定義されていれば、生成時に呼び出される

class Hoge
  def initialize
    @name = 'bar'
  end
  def sayName
    puts @name
  end
  def giveName name
    @name = name
  end
end

Hoge.new.sayName
initializeに引数を渡す
class Hoge
  def initialize name
    @name = name
  end
  def sayName
    puts @name
  end
end

Hoge.new('hogehoge').sayName

クラス変数
  • 1.6より実装。`@@'で始まる変数
class Foo
  @@name = 'foo'
end

puts Foo.new

 手続きオブジェクト

[初めてのJavaScript(関数)]
[クロージャ]

alert = Proc.new do
  puts "Error!"
end

alert.call

引数を取れる
alert = Proc.new do | reason |
  puts "Error! " + reason
end

alert.call 'Zero Divide'
alert.call 'Memory Leak'

 モジュール

  • 名前空間
  • mix-in

名前空間(メソッド)

module Foo
  def self.hoge
    puts "Foo.hoge"
  end
end

module Bar
  def self.hoge
    puts "Bar.hoge"
  end
end

Foo::hoge
Bar::hoge

名前空間(クラス)

module Foo
  class FooCls
    def hoge
      puts "Foo.hoge"
    end
  end
end

module Bar
  class BarCls
    def hoge
      puts "Bar.hoge"
    end
  end
end

Foo::FooCls.new.hoge
Bar::BarCls.new.hoge

mix-in

module Foo
  def foo
    puts "Foo"
  end
end

module Bar
  def bar
    puts "Bar"
  end
end

class MixinCls 
  include Foo
  include Bar
end

m = MixinCls.new
m.foo
m.bar

 オブジェクト指向

継承

class Foo
  def initialize(name)
    @name = name
  end
  def hoge
    puts @name
  end
end

class Bar < Foo
  def initialize(name)
    @name = name
  end
end

Bar.new('hoge').hoge
オーバーライド
class Foo
  def name(name)
    @name = name
  end 
  def hoge
    puts "Foo:" + @name
  end
end

class Bar < Foo
  def hoge
    puts "Bar:" + @name
  end
end

b = Bar.new
b.name('Bar')
b.hoge



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.