よーし、面白そうなRubyを勉強してみますか。
# encoding: sjis
# コメントはシャープ x = 10 # 行末まで全部コメント。/**/形式はない =begin ビギン-エンド形式の 複数行コメントもあり この場合は、行頭に書く必要あり =end
if x == 10 then # thenは省略可能 puts "x=10" elsif x == 20 # elseifじゃないのか… puts "x=20" else puts "x!=10" end
nums = [1,2,3,4,5] strs = ["a","b,"c"]
a = Array.new a = Array.new(5) # nilで5つ分初期化 a = Array.new(5,0) # 0で5つ分初期化
abc = %w(abc edf) # 空白で区切って配列に入るよー。
abc = "abc 123 XYZ".split()
names = ["渡辺","田中","佐藤"] names[4] = "田辺"
names.each do |name| puts name end
names.each do |name| print name end # そのまま1行にしただけ
names.each { |name| print name } # do,endを{}に変換→{}の場合は1行するのがルールみたい
while name = names.shift do print name end
names = ["渡辺","田中","佐藤"] names[4] = "田辺" while name = names.shift print name end
5.times do print "hello!\n" end
def hello print "hello DEF\n" end hello()
font_table = {:normal => '+0', :small => '-1', :big => '+1'}
font_table.each do | key, val |
print "key=[" + key.to_s + "],val=[" + val.to_s + "]\n"
end
h = { 'key1' => 'val1', 'key2' => 'val2' }
p h
h = { key1: 'val1', key2: 'val2' } # こっちは1.9から。キーがシンボルになるよー
p h
puts h.fetch(:key3,"キーが無いよー")
h = Hash.new('ハッシュのデフォルト値')
puts h["no_key"]
h = Hash.new{|hash,key|
hash[key] = key.upcase
}
puts h["no_key"]
a = Array.new(5) {|i| i+1 }
p a
a = Array.new(3, [0,0,0]) a[0][1] = 2 p a
ary1 = [1,2,3] ary2 = [10,20,30] ary3 = [100,200,300] result =[] ary1.zip(ary2, ary3) do |a,b,c| result << a+b+c # <<はpushと同じ end p result
ary = [1,2] a,b=ary p a p b
a, = ary p a
def foo(arg,*args) p arg p args end foo(1) foo(1,2,3)
hash = {:a => 100, :b => 200, :c => 300}
hash.each_with_index { |(key,val),index | p [key,val,index] }
p "This is Ruby".length p "This is Ruby".size
p "12345".length p "12345".size # p "12345".split(//u).length # UTF-8の場合→Ruby1.9の場合は、エラーになるよ!
str1 = "最初の言葉" str2 = "次の言葉" str = str1 + str2 puts str1,str2,str
str1 << str2 puts str1
class HelloWorld # クラス名は大文字スタート
def initialize(myname="Ruby") #コンストラクタはinitialize
@name = myname # @でインスタンス変数
end
def hello # インスタンスメソッド。デフォルトはpublic
print "hello world ", @name , "\n"
end
def HelloWorld.hello2(name) #クラスメソッドはnewしなくても使える
print "hello world2 ", @name , "\n"
end
def self.hello3(name) #クラスメソッドはselfでもOK
print "hello world2 ", @name , "\n"
end
class << self # クラスメソッドはこんな風にクラス定義もできる(複数メソッドの時はいいかな)
def hello3(name)
print "Hello2! ", name , ".\n"
end
end
end
bob = HelloWorld.new("Bob")
ruby = HelloWorld.new
bob.hello
ruby.hello
# クラスメソッドはどっちでも呼べる
HelloWorld.hello2('Name')
HelloWorld::hello3('Name')
class HelloWorld
attr_accessor :name #これだけで、setter/getter作るのと同じってイカス!
def greet
print "I am ", self.name ,"\n" # 自分はselfでアクセス
end
end
ruby = HelloWorld.new
ruby.name = "hoge"
ruby.greet
class RingArray < Array
def [](i)
idx = i % size # レシーバを省略するとselfが自動でつくから、これは[self.size]で割ることになる
super(idx)
end
end
eto = RingArray[ "子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥" ]
puts eto[6]
puts eto[11]
puts eto[15]
puts eto[-1] # これが亥になる
module MyModule #メソッド定義 end class MyClass1 include MyModule # ここでMyMduleのメソッドが使える end
print "-------シンプル版--------------------------------------------\n" print File.read(ARGV[0])
print "-------gets版--------------------------------------------\n" file = open(ARGV[0]) while text = file.gets print text end file.close
var = nil name = var || "Ruby" # varがnillなら"Ruby"を代入 →これはイイね! p name
name = "Ruby" if var != nil name = var end p name
item = ary && ary[0] #aryがnilじゃなければary[0]を代入→これもイイね! p item
var ||= 1 # var = var || 1 と同じ p var
File.open("sample.txt") do |f|
f.each_line do |line|
puts line
end
# ブロックの後処理として、closeが自動的に行われるらしい
end
sorted = ary.sort do |a,b| a <=> b end p sorted
ary = %w( 1000 200 30 4) sorted = ary.sort_by do |item| item.length end p sorted
久しぶりにRubyの仕事になるので、差分のメモを残しておく
# メソッドの定義: 位置引数(ハッシュ)を1つ取る
def display_profile(options)
puts "Name: #{options[:name]}"
puts "Age: #{options[:age]}"
end
| 実行環境 | 実行コード | 結果/挙動 |
| Ruby 1.9.2 | display_profile(name: "Alice", age: 30) | 正常に実行される |
| Ruby 3.0以降 | display_profile(name: "Alice", age: 30) | ArgumentError (キーワード引数として解釈されるため) |
| Ruby 3.0以降 | ハッシュとして明示的に渡す | display_profile({name: "Alice", age: 30}) |
def display_profile(name:, age:)
puts "Name: #{name}"
puts "Age: #{age}"
end
| 実行環境 | 実行コード | 結果/挙動 |
| Ruby 1.9.2 | display_profile(name: "Alice", age: 30) | ArgumentError (1.9.2ではキーワード引数構文は不完全だったため) |
| Ruby 3.0以降 | display_profile(name: "Alice", age: 30) | 正常に実行される |
| 実行環境 | 目的の処理 | 実行コード | 結果 |
| Ruby 1.9.2 | nilチェックあり | user.profile.address if user && user.profile | nilまたは値 |
| 最新版 | Safe Navigation Operator | user&.profile&.address | nilまたは値 |
# user が nil の可能性がある user = nil # Ruby 1.9.2 以前 # if user && user.profile # address = user.profile.address # else # address = nil # end # puts address #=> nil # Ruby 2.3 以降 address = user&.profile&.address puts address #=> nil
| 実行環境 | 目的の処理 | 実行コード |
| Ruby 1.9.2 | 複雑なcase/if文 | ハッシュキーの有無や値のチェックを多段階で行う |
| 最新版 | パターンマッチング | case文と => を使用し、構造を記述する |
data = { user_id: 101, status: :active, role: :admin }
case data
# status が :active かつ role が :admin の場合
in { status: :active, role: :admin, **rest }
puts "管理者としてログインしました。"
# status が :active かつ role が :user で、user_id が 100 より大きい場合
in { status: :active, role: :user, user_id: id } if id > 100
puts "一般ユーザーとしてログインしました。ID: #{id}"
else
puts "アクセスできません。"
end
#=> 管理者としてログインしました。
| 実行環境 | 目的の処理 | 実行コード |
| Ruby 1.9.2 | 並行処理 | Thread.new を使用(グローバルロックにより真の並列性は得にくい) |
| 最新版 | 並列処理 | Ractor.new を使用(一部のオブジェクトを共有せずに実行) |
# Ractor内で処理する値
sum = 0
data = [1, 2, 3, 4, 5]
# データをRactorに送信する
r = Ractor.new(data) do |data_in|
# Ractor内の処理は他のRactorやメインスレッドと並列で実行される
result = data_in.sum
Ractor.yield result # 結果を返す
end
# Ractorの結果を受け取る
sum = r.take
puts "合計: #{sum}" #=> 合計: 15