»文法・基本型はてなブックマークに追加はてなブックマークを見る

Rubyの文法

»文法概略

# 変数への代入
i = 2
j = 3
k = i + j

# 標準出力
print 'i = ', i, "\n"
print "j = #{j}\n"

print 'k = '
print k
print "\n"

実行結果

i = 2
j = 3
k = 5

»メソッド

def add( a, b )
  print "a: #{a}\n"
  print "b: #{b}\n"
  a + b
end

def sub( a, b )
  print "a: #{a}\n"
  print "b: #{b}\n"
  return a - b
end

print 'add: ', add( 5, 2 ), "\n"
print 'sub: ', sub( 2, 3 ), "\n"

実行結果

a: 5
b: 2
add: 7
a: 2
b: 3
sub: -1

»デフォルト値

def log_n( x, n = 10 )
  if n == 10
    return Math.log10( x )
  else
    return Math.log( x ) / Math.log( n )
  end
end

# log2( 32 )
print log_n( 32, 2 ), "\n"

# log10( 100 )
print log_n( 100 ), "\n"

実行結果

5.0
2.0

»可変長引数

def sum( *val )
  s = 0
  for v in val
    s += v
  end
  return s
end

print sum( 1, 4, 6, 3, 2, 9, 5 ), "\n"
print sum( 2, 7, 5, 8, 3 ), "\n"

実行結果

30
25

»メソッドのネスト

# nPx = n! / (n - x)!
def perm( n, x )
  # n!
  def fact( n )
    if n == 1
      return 1
    else
      return n * fact( n - 1 )
    end
  end

  return fact( n ) / fact( n - x )
end

print perm( 5, 2 ), "\n" 
print perm( 6, 4 ), "\n" 

実行結果

20
360

»配列

arr = []
arr[0] = 0
arr[1] = 1
arr[2] = 2
print arr, "\n"

arr = [0, 1, 2]
print arr, "\n"

arr = Array.new
arr[0] = 0
arr[1] = 1
arr[2] = 2
print arr, "\n"

for val in arr
  print "#{val}\n"
end

実行結果

0 1 2
0 1 2
0 1 2
0
1
2

»first, last, length, size, nitems

arr = [0, 1, 2, nil, 4, nil]
print 'first: ', arr.first, "\n"
print 'last: ', arr.last, "\n"
print 'length: ', arr.length, "\n"
print 'size: ', arr.size, "\n"
print 'nitems: ', arr.nitems, "\n"

実行結果

first: 0
last: nil
length: 6
size: 6
nitems: 4

»push, pop

arr = [0, 1, 2]
print arr, "\n"

arr.push( 3 )
print arr, "\n"
arr.push( 4 )
print arr, "\n"
arr.push( 5 )
print arr, "\n"

print arr.pop, ' < ', arr, "\n"
print arr.pop, ' < ', arr, "\n"
print arr.pop, ' < ', arr, "\n"

実行結果

0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
5  <  0 1 2 3 4
4  <  0 1 2 3
3  <  0 1 2

»shift, unshift

arr = [0, 1, 2]
print arr, "\n"

arr.unshift( 3 )
print arr, "\n"
arr.unshift( 4 )
print arr, "\n"
arr.unshift( 5 )
print arr, "\n"

print arr.shift, ' < ', arr, "\n"
print arr.shift, ' < ', arr, "\n"
print arr.shift, ' < ', arr, "\n"

実行結果

0 1 2
3 0 1 2
4 3 0 1 2
5 4 3 0 1 2
5  <  4 3 0 1 2
4  <  3 0 1 2
3  <  0 1 2

»<<, concat, delete, slice, sort

arr = []
print arr, "\n"

arr << 0
print arr, "\n"
arr << 1
print arr, "\n"
arr << 2
print arr, "\n"

arr.concat( [3, 4, 5] )
print arr, "\n"

print arr.slice( 2, 3 ), "\n"

arr.delete( 4 )
print arr, "\n"

arr = [0, 4, 1, 2, 5, 3]
print arr, "\n"
print arr.sort, "\n"

実行結果

0
0 1
0 1 2
0 1 2 3 4 5
2 3 4
0 1 2 3 5
0 4 1 2 5 3
0 1 2 3 4 5

»sort, sort!, reverse, reverse!

arr = [0, 4, 1, 2, 5, 3]

sorted = arr.sort
print sorted, "\n" 
print arr, "\n"

arr.sort!
print arr, "\n"

reversed = arr.reverse
print reversed, "\n" 
print arr, "\n"

arr.reverse!
print arr, "\n"

実行結果

0 1 2 3 4 5
0 4 1 2 5 3
0 1 2 3 4 5
5 4 3 2 1 0
0 1 2 3 4 5
5 4 3 2 1 0

»ハッシュ

hash = {}
hash['a'] = 0
hash['b'] = 1
hash['c'] = 2
print hash, "\n"

hash = { 'a' => 0, 'b' => 1, 'c' => 2 }
print hash, "\n"

arr = Hash.new
hash['a'] = 0
hash['b'] = 1
hash['c'] = 2
print hash, "\n"

for key, val in hash
  print "#{key} => #{val}\n"
end

実行結果

a 0 b 1 c 2
a 0 b 1 c 2
a 0 b 1 c 2
a => 0
b => 1
c => 2

»length, size, keys, values, key?, value?

hash = { 
  'a' => 0,
  'b' => 1,
  'c' => 2,
  'd' => 3,
  'e' => 4 }

print 'length: ', hash.length, "\n"
print 'size: ', hash.size, "\n"
print 'keys: ', hash.keys, "\n"
print 'values: ', hash.values, "\n"
print 'a: ', hash.key?( 'a' ), "\n"
print '6: ', hash.value?( 6 ), "\n"

実行結果

length:  5
size:  5
keys:  a b c d e
values:  0 1 2 3 4
a:  true
6:  false

»each_pair, each_key, each_value, fetch, index

hash = { 
  'a' => 0,
  'b' => 1,
  'c' => 2,
  'd' => 3,
  'e' => 4 }

hash.each_pair do |key, value|
  print "#{key} => #{value}\n"
end

hash.each_key do |key|
  print "#{key} => ", hash.fetch( key ), "\n"
end

hash.each_value do |value|
  print "#{value} <= ", hash.index( value ), "\n"
end

実行結果

a => 0
b => 1
c => 2
d => 3
e => 4
a =>  0
b =>  1
c =>  2
d =>  3
e =>  4
0 <=  a
1 <=  b
2 <=  c
3 <=  d
4 <=  e

»文字列

str = 'abc' * 3
print "#{str}\n"

files = `ls`
print files

実行結果(例)

abcabcabc
sample.log
sample.rb
sample.rb~
work

»ヒアドキュメント

str = <<END_OF_STR
line1
line2
line3
END_OF_STR

print str

print <<END_OF_STR, "str\n"
line1
line2
line3
END_OF_STR

実行結果

line1
line2
line3
line1
line2
line3
str

»ヒアドキュメントのインデント

def str
  return <<-END_OF_STR
line1
line2
line3
  END_OF_STR
end

print str

実行結果

line1
line2
line3

»chomp, chomp!

str = "line\n"
print str.chomp

str.chomp!
print str

実行結果

lineline

»to_i, to_f

print "123".to_i + "456".to_i, "\n"
print "1.0e-2".to_f + "12.3".to_f, "\n"

実行結果

579
12.31

»slice, [, ], [..] [#hc350653]

str = "abcdefgh"
print str.slice( 4, 2 ), "\n"
print str.slice( 6, 1 ), "\n"

print "#{str[4, 2]}\n"
print "#{str[6, 1]}\n"

print "#{str[4..5]}\n"
print "#{str[6..6]}\n"

実行結果

ef
g
ef
g
ef
g

»正規表現、置換

str = "GET /index.html HTTP/1.0"

if str =~ /\s([^\s]+)/
  print "#{$1}\n"
end

str = "a123bc4d5e678f90g"

print str.gsub( /\d{2,}/, '?' ), "\n"

str.gsub!( /\d{2,}/, '?' )

print "#{str}\n"

実行結果

/index.html
a?bc4d5e?f?g
a?bc4d5e?f?g

»split

str = "GET /index.html HTTP/1.0"

# 空白で分割
for s in str.split( /\s/ )
  print "#{s}\n"
end

# /で分割
for s in str.split( /\// )
  print "#{s}\n"
end

# .で分割
for s in str.split( /\./ )
  print "#{s}\n"
end

実行結果

GET
/index.html
HTTP/1.0
GET
index.html HTTP
1.0
GET /index
html HTTP/1
0

»sprintf

print sprintf( "%04d %8s 0x%x\n", 123, 'abc', 465 )

実行結果

0123      abc 0x1d1

»整数・実数

# 整数(10進)
print 12345, "\n"
print -98765, "\n"
print 0d12345, "\n"
print 123456789012345678901234567890, "\n"

# 整数(16進)
print 0x8000, "\n"

# 整数(8進)
print 0770, "\n"
print 0o644, "\n"

# 整数(2進)
print 0b10000000, "\n"

# 浮動小数点数
print 123.45, "\n"
print 3.0e8, "\n"
print -1.602e-19, "\n"

実行結果

12345
-98765
12345
123456789012345678901234567890
32768
504
420
128
123.45
300000000.0
-1.602e-19

»冪乗

print 3 ** 2, "\n"
print 1.414 ** 2.0, "\n"

実行結果

9
1.999396

»inifinite?, nan?

float = 0.0
posinf = +1.0 / 0.0
neginf = -1.0 / 0.0
nan = 0.0 / 0.0

print "#{float} ", float.infinite? , "\n"
print "#{posinf} ", posinf.infinite? , "\n"
print "#{neginf} ", neginf.infinite? , "\n"
print "#{nan} ", nan.nan? , "\n"

実行結果

0.0 nil
Infinity 1
-Infinity -1
NaN true

»truncate, round, ceil, floor

print (3.7).truncate, "\n"
print (3.7).round, "\n"
print (3.7).ceil, "\n"
print (3.7).floor, "\n"

実行結果

3
4
4
3

»定数

FOO = 'foo'
Bar = 'bar'

print "#{FOO} #{Bar}\n"

Bar = 'foo'
FOO = Bar

print "#{FOO} #{Bar}\n"

実行結果

foo bar
./sample.rb:8: warning: already initialized constant Bar
./sample.rb:9: warning: already initialized constant FOO
foo foo

»数学定数

print Math::E, "\n"
print Math::PI, "\n"

実行結果

2.71828182845905
3.14159265358979

»演算子

未整理

Sponsored Link