# ããã°ã©ã å®è¡
$ ruby sample.rb
# ã³ã¡ã³ã
\# â 1è¡
=begin
ãã®ããã«
è€æ°è¡ã«ããã£ãŠ
ã³ã¡ã³ããå¯èœ
=end
# åŸããæ»ãããããæ
# ã³ã¡ã³ãã¢ãŠã => 泚é
# åºå
puts "Hello Worldâ
text = "Hello World" # 倿°å®£èš
msg # ããŒã«ã«å€æ°
$msg # ã°ããŒãã«å€æ°
@msg # ã€ã³ã¹ã¿ã³ã¹å€æ°
@@msg # ã¯ã©ã¹å€æ°
MSG # 宿°(ã³ã³ã¹ã¿ã³ã)
# 倿°åã¯æ
£ç¿çã«ã¹ããŒã¯ã±ãŒã¹ã§æžã
special_price
# ãã£ã¡ã«ã¯äœ¿ããªã
specialPrice
# æååã®å®çŸ©(åŒçšç¬Šã§å²ã)
# äžéåŒçšç¬Š (äžã«ããåŒã倿°ãå±éããªã)
'test'
# äžéåŒçšç¬Šã§å²ããš\nã¯ãã ã®æååã«ãªã
puts' ããã«ã¡ã¯\nããããªã'
#=> ããã«ã¡ã¯\nããããªã
# äºéåŒçšç¬Š (äžã«ããåŒã倿°ãå±éãã)
"test"
# äºéåŒçšç¬Šã§å²ããš\nãæ¹è¡æåãšããŠæ©èœãã
puts "ããã«ã¡ã¯\nããããªã"
#=> ããã«ã¡ã¯
# ããããªã
# æååã®åŒå±é(æåé£çµãããã¡ãã䜿çš)
first_name = "Michael" # 倿°ã®ä»£å
¥
"Michael"
"#{first_name} Hartl" # æååã®åŒå±é
"Michael Hartl"
# èšç®åŒãåã蟌ãã
puts "#{5*5}"
# äžéåŒçšç¬ŠãäºéåŒçšç¬Šã©ã¡ãã䜿çšãããã¯ãã奜ããªæ¹ã§è¯ãã
# ããŒã ã®ã³ãŒãã£ã³ã°èŠçŽã«åŸã
# %èšæ³
# %q! !ã¯ã·ã³ã°ã«ã¯ãªãŒãã§å²ãã ããšãšåãã«ãªã
puts %q!He said,"Don't speak."! #=> He said,"Don't speak."
# %Q! !ã¯ããã«ã¯ãªãŒãã§å²ãã ããšãšåãã«ãªã(æ¹è¡æåãåŒå±éã䜿ãã)
something = "Hello."
puts %Q!He said,"#{something}"! #=> He said,"Hello."
# %! !ãããã«ã¯ãªãŒãã§å²ãã ããšãšåãã«ãªã
something = " Bye."
puts %!He said,"#{something}"! #=> He said,"Bye."
# æŒç®åŒ
10 + 20 # => 30
100 - 25 # => 75
12 * 5 # => 60
20 / 5 # => 4
8 % 3 # => 2
2 ** 3 # => 8
# æŽæ°å士ã®å²ãç®ã¯0ã«ãªã
1 / 2 #=> 0
# å°æ°ãŸã§åºãããå Žåã¯ãçæ¹ãããã¯äž¡æ¹ãå°æ°ã«ãã
1.0 / 2 #=> 0.5
1 / 2.0 #=> 0.5
1.0 / 2.0 #=> 0/5
# é
åã®çæ
array = [1, 2, 3]
# ã€ãã¬ãŒã¿
books.each do |key, val|
puts "#{key},#{val}å"
end
# mapã¡ãœãã(åèŠçŽ ã«å¯ŸããŠãããã¯ãè©äŸ¡ããçµæããæ°ããé
åã«ããŠè¿ã)
# numberã®åèŠçŽ ã10åã«ããæ°ããé
ånew_numbersãè¿ã
numbers = [1, 2, 3, 4, 5]
new_numbers = numbers.map{ |n| n * 10}
puts new_numbers #=> [10, 20, 30, 40, 50]
# selectã¡ãœãã(åèŠçŽ ã«å¯ŸããŠããããã¯ãè©äŸ¡ãããã®æ»ãå€ãçã®èŠçŽ ãéããé
åãè¿ã)
numbers = [1, 2, 3, 4, 5, 6]
# å¶æ°ã®å€ã®ã¿è¿ã
even_numbers = numbers.select{ |n| n.even?}
even_numbers #=> [2, 4, 6]
# rejectã¡ãœãã(åèŠçŽ ã«å¯ŸããŠããããã¯ãè©äŸ¡ãããã®æ»ãå€ãåœã®èŠçŽ ãéããé
åãè¿ã)
numbers = [1, 2, 3, 4, 5, 6]
# å¶æ°ã®å€ä»¥å€(奿°)ã®ã¿è¿ã
even_numbers = numbers.reject{ |n| n.even?}
even_numbers #=> [1, 3, 5]
# ç¹°ãè¿ãèšç®ãè¡ã
# eachã¡ãœããã䜿çšããæžãæ¹
numbers = [1, 2, 3, 4]
sum = 0
numbers.each {|n| sum += n}
puts sum #=> 10
# injectã¡ãœããã䜿çšããæžãæ¹
numbers = [1, 2, 3, 4]
sum = numbers.inject(0) {|result, n| result + n}
# 1åç® : result=0ãn=1ã§ã0+1=1ããããæ¬¡ã®resultã«å
¥ãã
# 2åç® : result=1ãn=2ã§ã1+2=3ããã®çµæã次ã®resultã«å
¥ãã
# 3åç® : result=3ãn=3ã§ã3+3=6ããã®çµæã次ã®resultã«å
¥ãã
# 4åç® : result=6ãn=4ã§ã6+4=10ãæåŸã®èŠçŽ ã«éããã®ã§ãããinjectã¡ãœããã®æ»ãå€ã«ãªãã
puts sum #=> 10
# each_with_index(é
åã®æ·»åãååŸãã)
fruits = ['apple', 'orange', 'melon']
# ãããã¯åŒæ°ã®iã«ã¯0,1,2...ãšèŠçŽ ã®æ·»åãå
¥ã
fruits.each_with_index { |fruit, i| puts "#{i},#{fruit}" }
#=> 0,apple
#=> 1,orange
#=> 2,melon
# map.with_indexã§ãå¯èœ
fruits.map.with_index { |fruit, i| puts "#{i},#{fruit}" }
# Rubyã¯ããŒã¿åãæ··åšããé
åãçæå¯èœ
person = {
# æåå
name: 'Alice',
# æ°å€
age: 20,
# é
å
friends:['Bob','Carol'],
# ããã·ã¥
phones:{home:'1234-0000',mobile:'5678-0000'}
}
ããã·ã¥(飿³é
å)
# 空ã®ããã·ã¥ãäœã
{}
# ããŒãšå€ã®çµã¿åããã3ã€æ ŒçŽããããã·ã¥
{ããŒ1 => å€1, ããŒ2 => å€2, ããŒ3 => å€3}
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}
# æ¹è¡å¯èœ
currencies = {
'japan' => 'yen',
'us' => 'dollar',
'india' => 'rupee'}
# èŠçŽ ã®è¿œå
ããã·ã¥[ããŒ] = å€
currencies['italy'] = 'euro'
# èŠçŽ ã®ååŸ
ããã·ã¥[ããŒ]
currencies['italy'] #=> 'euro'
# èŠçŽ ã®åé€
ããã·ã¥.delete(ããŒ)
currencies.delete('italy')
# ããã·ã¥ã®ç¹°ãè¿ãåŠç
currencies.each do |key, value|
puts "#{key} : #{value}"
end
# ããã·ã¥åã³åèŠçŽ ã®åçµ
SOME_NAMES = ['Foo','Bar','Baz'].map(&:freeze).freeze
:ã·ã³ãã«ã®åå
:apple
################
# æååãšã®éã
################
# ã¯ã©ã¹
'apple'.class #=> String
:apple.class #=> Symbol
# æååã¯Stringãªããžã§ã¯ã
# ã·ã³ãã«ã¯Rubyå
éšã®æŽæ°
# ã·ã³ãã«ã¯æååãããé«éã«åŠçã§ãã
'apple' == 'apple'
:apple == :apple
# ããã·ã¥ã®ããŒã«ãã䜿çšããã(æååãããŒã«ãããããé«é)
currencies = {
:japan => 'yen',
:us => 'dollar',
:india => 'rupee'}
currencies[:italy]
# ã·ã³ãã«ã¯ãããŒ:å€ãã§ã®æžãæ¹ã§ãããã·ã¥ãçæã§ãã(ã:ã³ãã³ãã®äœçœ®ãéã«ãªã)
currencies = {
japan :'yen',
us :'dollar',
india :'rupee'}
# æååã¯åãæååã§ãå¥ãªããžã§ã¯ã
# ã·ã³ãã«ã¯åãã·ã³ãã«ã§ããã°åããªããžã§ã¯ãã«ãªãããã¡ã¢ãªå¹çããã
'apple'.object_id #=> 70363037037880
'apple'.object_id #=> 70363036621920
'apple'.object_id #=> 70363044179100
:apple.object_id #=> 1159068
:apple.object_id #=> 1159068
:apple.object_id #=> 1159068
# æååã¯ç Žå£ç倿Žãå¯èœ(ãã¥ãŒã¿ãã«)
string = 'apple'
string.upcase!
string
# ã·ã³ãã«ã¯ç Žå£ç倿Žãäžå¯èœ(ã€ãã¥ãŒã¿ãã«)
symbol = :apple
symbol.upcase!
# ifæ
if æ¡ä»¶A
æ¡ä»¶ã«äžèŽããå Žåã®åŠç
elsif æ¡ä»¶B
æ¡ä»¶AãšäžèŽãããæ¡ä»¶Bã«äžèŽããã®æã®åŠç
else
æ¡ä»¶A, Bã®ã©ã¡ãã«ãäžèŽããªãæã®åŠç
end
# éåžžif
point = 7
day = 1
# 1æ¥ã§ããã°ãã€ã³ã5å
if day == 1
point *= 5
end
point #=> 35
# åŸå€if
point = 7
day = 1
# 1æ¥ã§ããã°ãã€ã³ã5å
point *= 5 if day == 1
point #=> 35
# foræ(Rubyã§ã¯ããŸã䜿ããªã)
for 倿° in ãªããžã§ã¯ã do #doã¯è€æ°è¡èšè¿°ã§ããã°çç¥å¯
åŠç
end
# whileæ(Rubyã§ã¯ããŸã䜿ããªã)
while æ¡ä»¶åŒ do #doã¯è€æ°è¡èšè¿°ã§ããã°çç¥å¯
åŠçïŒ
end
ç¹°ãè¿ãåŠçã®å¶åŸ¡æ§æ
# breakæ (ã«ãŒããæãã(å
åŽã®ã«ãŒãã®ã¿))
numbers = [1, 2, 3, 4, 5].shuffle
numbers.each do |n|
puts n
# 5ãåºåããããã«ãŒããæãã
break if n == 5
end
# throw/catchæ(ã«ãŒããæãã(倧å€ã®ã«ãŒããŸã§æãã))(äŸå€åŠçãšã¯é¢ä¿ãªãã®ã§æ³šæ)
fruits = ['apple','melon','orange']
numbers = [1,2,3]
catch :done do
fruits.shuffle.each do |fruit|
numbers.shuffle.each do |n|
puts "#{fruits}, #{n}"
# 'orange'ãš3ã®çµã¿åããã®å Žå
if fruit == 'orange' && n ==3
# å
šãŠã®åŠçãæãã
throw :done
end
end
end
end
çåœå€/è«çæŒç®å
# falseãŸãã¯nilã§ããã°åœ
# ãã以å€ã¯å
šãŠç
# falseãŸãã¯nil以å€ã¯çãªã®ã§ä»¥äžã®ãããªå¶åŸ¡æ§æãããã
data = find_data
if data
'ããŒã¿ããããŸã'
else
'ããŒã¿ã¯ãããŸãã'
end
t1 = true
t2 = true
f1 = false
# OR
t1 || t2 #=> true
t1 || f1 #=> true
# AND
t1 && t2 #=> true
t1 && f1 #=> false
# !æŒç®åã§å転
!t1 #=> false
# ã¡ãœããåŒã³åºã
ãªããžã§ã¯ã.ã¡ãœãã(åŒæ°1,åŒæ°2,åŒæ°3)
# æ¬åŒ§çç¥å¯
ãªããžã§ã¯ã.ã¡ãœãã åŒæ°1,åŒæ°2,åŒæ°3
# ã¡ãœãã
def ã¡ãœããå(åŒæ°) #åŒæ°ã¯åŒã³åºãåŽããã¡ãœããã«æž¡ãããå€ã®ããš
åŠç
return æ»ãå€ #å¿
èŠãªå Žåã®ã¿èšè¿° Rubyã§ã¯äž»æµã§ã¯ãªã
end
# ã¡ãœããåã¯ã¹ããŒã¯ã±ãŒã¹ã§
def hello_world
'Hello Wolrd'
end
##############################
# ã¡ãœããã®ããŒã¯ãŒãåŒæ°ãšããã·ã¥
##############################
def ã¡ãœããå(ããŒã¯ãŒãåŒæ°1:ããã©ã«ãå€1, ããŒã¯ãŒãåŒæ°2:ããã©ã«ãå€2)
# ã¡ãœããã®å®è£
end
def buy_burger(menu, drink: true , potato: true)
# ãã³ããŒã¬ãŒã賌å
¥
ããputs "#{menu}ããŒã¬ãŒãè²·ããŸãã"
if drink
# ããªã³ã¯ã賌å
¥
puts "ããªã³ã¯ãè²·ããŸãã"
end
if potato
# ãããã賌å
¥
puts "ããããè²·ããŸãã"
end
end
# ããŒã¯ãŒãåŒæ°ã䜿ãå Žåã®åŒã³åºãæ¹
buy_burger('ããŒãº', drink: true, potato: true)
buy_burger('ãã£ãã·ã¥', drink: true, potato: false)
# ã¡ãœãããã§ãŒã³ã®äŸ
nil.to_s.empty?
# ã¯ã©ã¹
class ã¯ã©ã¹å
ã¡ãœãããªã©ãèšè¿°
end
# ã€ã³ã¹ã¿ã³ã¹ã®çæ
倿° = ã¯ã©ã¹å.new
# initializeã¡ãœããã¯newããæã«åŒã³åºããã(ã³ã³ã¹ãã©ã¯ã¿ãšåæ§)
class User
def initialize
puts 'initialized'
end
end
User.new
#=>initialized
# ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®å®çŸ©ãšåŒã³åºã
class User
def hello
"Hello!"
end
end
user = User.new
user.hello
# ã¢ã¯ã»ãµã¡ãœãã(ã²ãã¿ãŒ/ã»ãã¿ãŒã®ã¡ãœããå®çŸ©ãäžèŠã«ãªã)
class User
# @nameãèªã¿æžãããã¡ãœãããèªåçã«å®çŸ©ããã
attr_accessor :name
# èªã¿åãå°çš
attr_reader :name
# æžã蟌ã¿å°çš
attr_writer :name
def initialize(name)
@name = name
end
end
# ã¯ã©ã¹ã¡ãœãããå®çŸ©ããæ¹æ³ ãã®1
class ã¯ã©ã¹å
def self.ã¯ã©ã¹ã¡ãœãã
# ã¯ã©ã¹ã¡ãœããã®åŠç
end
end
# ã¯ã©ã¹ã¡ãœãããå®çŸ©ããæ¹æ³ ãã®2
class ã¯ã©ã¹å
class << self
def ã¯ã©ã¹ã¡ãœãã
# ã¯ã©ã¹ã¡ãœããã®åŠç
end
end
end
# ã¯ã©ã¹ã¡ãœããã®åŒã³åºã
ã¯ã©ã¹å.ã¡ãœããå
# ã¯ã©ã¹å®æ°
class Product
# 宿°å(倧æåãšæ°åãã¢ã³ããŒã¹ã³ã¢ã§æ§æ)
DEFAULT_PRICE = 0
attr_reader :name, :price
def initialize(name,price = DEFAULT_PRICE)
@name = name
@price = price
end
end
product = Product.new('A free movie')
product.price
# ã¯ã©ã¹ã®å€éšãã宿°ãåç
§
Product::DEFAULT_PRICE #=> 0
# ç¶æ¿
class Word < String # Wordã¯ã©ã¹ã¯Stringã¯ã©ã¹ãç¶æ¿ãã
# ã¹ãŒããŒã¯ã©ã¹ã®åçã¡ãœããã®åŒã³åºã
class Product
attr_reader :name, :price
def initialize(name, price)
@name = name
@price = price
end
end
class DVD < Product
attr_reader :running_time
def initialize(name, price, running_time)
# ã¹ãŒããŒã¯ã©ã¹ã®initializeã¡ãœãããåŒã³åºã
super(name, price)
@running_time = running_time
end
end
#############################################
# public => ããã©ã«ããã¯ã©ã¹å€ããèªç±ã«åŒã³åºããã
#############################################
class User
def hello
'Hello!'
end
end
user = User.new
user.hello #=> Hello!
#############################################
# protected => ãã®ã¡ãœãããå®çŸ©ããã¯ã©ã¹èªèº«ãšããµãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¡ãœããããã¬ã·ãŒãä»ãã§åŒã³åºãã
# å€éšã«ã¯å
¬éããããªãããåãã¯ã©ã¹ããµãã¯ã©ã¹ã®äžã§ããã°ã¬ã·ãŒãä»ãã§åŒã³åºããããã«ããæã«äœ¿çš
#############################################
class User
# weightã¯å€éšã«å
¬éããªã
attr_reader :name
def initialize(name, weight)
@name = name
@weight = weight
end
# èªåãother_userããéãå Žåã¯true
def heavier_than?(other_user)
other_user.weight < @weight
end
# protectedã¡ãœãããªã®ã§åãã¯ã©ã¹ããµãã¯ã©ã¹ã§ããã°ã¬ã·ãŒãä»ãã§åŒã³åºãã
protected
def weight
@weight
end
end
alice = User.new('Alice', 50)
bob = User.new('Bob', 60)
alice.heavier_than?(bob) #=> false
bob.heavier_than?(alice) #=> true
# ã¯ã©ã¹ã®å€ã§ã¯weightã¯åŒã³åºããªã
alice.weight #=>NoMethodError: protected method `weight' called for #<User:0x007fb3f485b920 @name="Alice", @weight=50>
#############################################
# private => ã¯ã©ã¹å€ããã¯åŒã³åºãããã¯ã©ã¹å
éšã§ã®ã¿äœ¿ããã¡ãœããã
# å³å¯ã«èšããšãã¬ã·ãŒããæå®ããŠåŒã³åºãäºãåºæ¥ãªãã¡ãœãã
#############################################
class User
private
def hello
'Hello!'
end
end
user = User.new
user.hello #=> NoMethodError: private method `hello' called for #<User:0x007fc9ef130400>
# privateã¯ãµãã¯ã©ã¹ãããåŒã³åºãã
class Product
private
def name
'A great movie'
end
end
class DVD < Product
def to_s
# nameã¯ã¹ãŒããŒã¯ã©ã¹ã®privateã¡ãœãã
"name: #{name}"
end
end
dvd = DVD.new
dvd.to_s #=> "name: A great movie"
# privateã«ãªãã®ã¯ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã ãã§ãã¯ã©ã¹ã¡ãœããã¯privateã«ãªããªã
class User
private
def self.hello
'Hello!'
end
end
User.hello #==> "Hello!"
# ãããã¯ã«ããç¹°ãè¿ãåŠç
numbers = [1,2,3,4]
sum = 0
numbers.each do |n|
sum += n
end
puts sum #=> 10
# do...endã®æ¿ããã«{}ã䜿çšã§ãã(1è¡ãªã©ã³ã³ãã¯ãã«æžãããæ)
numbers = [1,2,3,4]
sum = 0
numbers.each {|n| sum += n}
puts sum #=> 10
# ãããã¯èšæ³ã®äŸ
%w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
%w[A B C].map(&:downcase)
=> ["a", "b", "câ]
###############################
# åºæ¬æ§æ
###############################
begin
# äŸå€ãèµ·ãããåŠç
rescue => äŸå€ãªããžã§ã¯ããæ ŒçŽãã倿°
# äŸå€ãçºçããå Žåã®åŠç
ensure
# äŸå€ã®æç¡é¢ãããå®è¡ããåŠç
end
###############################
# äŸå€ãªããžã§ã¯ãããæ
å ±ãååŸãããæã®æ§æ
###############################
begin
1 / 0
rescue => e
puts "ãšã©ãŒã¯ã©ã¹: #{e.class}"
puts "ãšã©ãŒã¡ãã»ãŒãž: #{e.message}"
puts "ããã¯ãã¬ãŒã¹ -----"
puts e.backtrace
puts "-----"
end
###############################
# ã¯ã©ã¹ãæå®ããŠãè£è¶³ããäŸå€ãéå®
###############################
begin
# äŸå€ãèµ·ãããåŠç
rescue è£è¶³ãããäŸå€ã®ã¯ã©ã¹
# äŸå€ãçºçããå Žåã®åŠç
end
begin
1 / 0
rescue ZeroDivisionError
puts "0ã§é€ç®ããŸãã"
end
#=> 0ã§é€ç®ããŸãã
###############################
# äŸå€çºçæã«åŠçãããçŽãretry
###############################
begin
# äŸå€ãèµ·ãããåŠç
rescue
retry # åŠçããããªãã
end
# ç¡éã«ãŒããé²ãããretryã®åæ°ã¯å¶éãã
retry_count = 0
begin
puts 'åŠçãéå§ããŸãã'
# ãããšäŸå€ãçºçããã
1 / 0
rescue
retry_count += 1
if retry_count <= 3
puts "retryããŸããïŒ#{retry_count}åç®ïŒ"
retry
else
puts 'retryã«å€±æããŸããã'
end
end
#=> åŠçãéå§ããŸãã
# retryããŸããïŒ1åç®ïŒ
# åŠçãéå§ããŸãã
# retryããŸããïŒ2åç®ïŒ
# åŠçãéå§ããŸãã
# retryããŸããïŒ3åç®ïŒ
# åŠçãéå§ããŸãã
# retryã«å€±æããŸããã
###############################
# æå³çã«äŸå€ãçºçãããraise
###############################
def currency_of(country)
case country
when :japan
'yen'
when :us
'dollar'
when :india
'rupee'
else
# æå³çã«äŸå€ãçºçããã
raise "ç¡å¹ãªåœåã§ãã#{country}"
end
end
currency_of(:japan) #=> "yen"
currency_of(:italy) #=> RuntimeError: ç¡å¹ãªåœåã§ããitaly
###############################
# ãã¡ã€ã«æžã蟌ã¿åŠçã®ãµã³ãã«
###############################
# æžã蟌ã¿ã¢ãŒãã§ãã¡ã€ã«ãéã
file = File.open('some.txt', 'w')
begin
# ãã¡ã€ã«ã«æååãæžã蟌ã
file << 'Hello'
ensure
# äŸå€ã®æç¡ã«ãããããå¿
ããã¡ã€ã«ãã¯ããŒãºãã
file.close
end
# ãããã¯ä»ãã§ãªãŒãã³ãããšãã¡ãœããã®å®è¡åŸã«èªåçã«ã¯ããŒãºããã
# ãã¡ã€ã«åŠçã®ããã«ã䜿çšãããå¿
ããªãœãŒã¹ãè§£æŸããããšããåŠçã¯ãRubyã§ã¯ãããã¯ä»ãã®ã¡ãœããã䜿ãããšã§èªåçã«åŠçã§ããã±ãŒã¹ãå€ãã
# ensureã䜿çšããåã«ãããã¯ä»ã§åŠçã§ããªããAPIããã¥ã¡ã³ãã§ç¢ºèªããã
File.open('some.txt', 'w') do |file|
file << 'Hello'
end
ããã¯ã¹ã©ãã·ã¥èšæ³(ãšã¹ã±ãŒãã·ãŒã±ã³ã¹)
\t # ã¿ã
\n # æ¹è¡
\â # äºéåŒçšç¬Š
\â # äžéåŒçšç¬Š
\s # ã¹ããŒã¹
\nnn # 8鲿°è¡šèš
\xnn # 16鲿°è¡šèš
a = <<TEXT
ããã¯ãã¢ããã¥ã¡ã³ãã§ãã
è€æ°è¡ã«æž¡ãé·ãæååãäœæããã®ã«äŸ¿å©ã§ãã
TEXT
puts a
def some_method
<<-TEXT
ããã¯ãã¢ããã¥ã¡ã³ãã§ãã
<<-ã䜿ããšæåŸã®èå¥åãã€ã³ãã³ããããäºãåºæ¥ãŸãã
TEXT
end
puts some_method
# ç¯å²ãªããžã§ã¯ã
a = [1,2,3,4,5]
a[1..3] #=> [2,3,4]
a[1...3] #=> [2,3]
# æ¡ä»¶ã®ç¯å²ãç°¡åã«æžãæãããã
def liquid?(temperature)
0 <= temperature && temperature < 100
end
def liquid?(temperature)
(0..100).include?(temperature)
end
==ã# çãã
=== # çãã(caseæ)
!=ã# çãããªã
> # ãã倧ãã
>= # çãããããã倧ãã
< # ããå°ãã
<= # çããããããå°ãã
<=> # å·Š > å³(ãŒ1) çãã(0)倧ãã(1)
=~ ãã¿ãŒã³ããã(æ£èŠè¡šçŸ) äžèŽ
!~ ãã¿ãŒã³ããã(æ£èŠè¡šçŸ) äžèŽããªã
# æ¥ä»
time = Time.now
puts time.strftime("%Y/%m/%d %H:%M:%S")
# å°æ°
sprintf('%0.3f', 1.2) #=>"1,200"
ã©ã€ãã©ãªã®èªã¿èŸŒã¿
# 1åã®ã¿ã®èªã¿èŸŒã¿(ã©ã€ãã©ãªã倿ŽãããŠããä¿®æ£ãåæ ãããªã)
require ã©ã€ãã©ãªå
# Dateã¯ã©ã¹ã䜿çšããæ
require 'date'
Date.today
# èªåã§äœæããã¯ã©ã¹ãèªã¿èŸŒãæ
require './sample.rb'
# .rbã¯çç¥å¯
require './sample'
# æ¯åç¡æ¡ä»¶ã«èªã¿èŸŒã¿
load ã©ã€ãã©ãªå
# sample.txtãéããŠæååãæžã蟌ã(ã¯ããŒãºåŠçã¯èªåçã«è¡ããã)
File.open("./sample.txt", "w") do |file|
file.puts("1è¡ç®ã®ããã¹ãã§ãã")
file.puts("2è¡ç®ã®ããã¹ãã§ãã")
file.puts("3è¡ç®ã®ããã¹ãã§ãã")
end
# ã¢ãžã¥ãŒã«ã®çšé
ã» ç¶æ¿ã䜿ããã«ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã远å ããããããã¯äžæžãããã(ããã¯ã¹ã€ã³)
ã» è€æ°ã®ã¯ã©ã¹ã«å¯ŸããŠå
±éã®ç¹ç°ã¡ãœãã(ã¯ã©ã¹ã¡ãœãã)ã远å ãã(ããã¯ã¹ã€ã³)
ã» ã¯ã©ã¹åã宿°åã®è¡çªãé²ãããã«åå空éãäœãã
ã» é¢æ°çã¡ãœãããå®çŸ©ãã
ã» ã·ã³ã°ã«ãã³ãªããžã§ã¯ãã®ããã«æ±ã£ãŠèšå®å€ãªã©ãä¿åãã
# ã¢ãžã¥ãŒã«ã®å®çŸ©
module ã¢ãžã¥ãŒã«å
# ã¢ãžã¥ãŒã«ã®å®çŸ©(ã¡ãœããã宿°ãªã©)
end
module Greeter
def hello
'hello'
end
end
########################################
# ã¢ãžã¥ãŒã«ã®includeããŠæ©èœã远å (è¿œå æ©èœã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¡ãœãããšãªã)
########################################
module Loggable
def log(text)
puts "[LOG] #{text}"
end
end
class Product
include Loggable
def title
log 'title is called'
'A great movie'
end
end
class User
include Loggable
def name
log 'name is called'
'Alice'
end
end
product = Product.new
product.title
# [LOG] title is called
# => "A great movie"
user = User.new
user.name
# [LOG] name is called
# => "Alice"
########################################
# ã¢ãžã¥ãŒã«ã®extendããŠæ©èœã远å (è¿œå æ©èœã¯ã¯ã©ã¹ã®ç¹ç°(ã¯ã©ã¹)ã¡ãœãããšãªã)
########################################
class Product
extend Loggable
def self.create_products(names)
log 'create_products is called'
end
end
# ã¯ã©ã¹ã¡ãœããçµç±ã§logã¡ãœãããåŒã³åºããã
Product.create_products([])
# Productã¯ã©ã¹ã®ã¯ã©ã¹ã¡ãœãããšããŠçŽæ¥åŒã³åºãäºãå¯èœ
Product.log('Hello')
########################################
# ç¶æ
ãä¿æããã¢ãžã¥ãŒã«äŸ
########################################
# AwesomeApiã¯äœããã®Web APIãå©çšããã©ã€ãã©ãªããšããæ³å®
module AwesomeApi
# èšå®å€ãä¿æããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹å€æ°ãçšæãã
@base_url = ""
@debug_mode = false
# ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹å€æ°ãèªã¿æžãããããã®ç¹ç°ã¡ãœãããå®çŸ©ãã
class << self
def base_url=(value)
@base_url = value
end
def base_url
@base_url
end
def debug_mode=(value)
@debug_mode = value
end
def debug_mode
@debug_mode
end
# æ¬æ¥ã¯ãã®1è¡ã§OK
# attr_accessor :base_url, :debug_mode
end
end
# èšå®å€ãä¿åãã
AwesomeApi.base_url = 'http://example.com'
AwesomeApi.debug_mode = true
# èšå®å€ãåç
§ãã
AwesomeApi.base_url
AwesomeApi.debug_mode
# æ£èŠè¡šçŸã¯ã¹ã©ãã·ã¥ãã¿ãŒã³ã§å²ãã§è¡šçŸ
/æ£èŠè¡šçŸ/
# =~ ã§ãããããäœçœ®ãè¿ã
'123-4567' =~ /\d{3}-\d{4}/
=>0
# ãããããªãå Žåã¯nilãè¿ã
'hello' =~ /\d{3}-\d{4}/
=>nil
# ãã£ããã£ã®çµæã«ååãã€ãã
text = 'ç§ã®èªçæ¥ã¯1977幎7æ17æ¥ã§ãã'
m = /(?<year>\d+)幎(?<month>\d+)æ(?<day>\d+)æ¥/.match(text)
m[:year] #=> "1977"
m[:month] #=> "7"
m[:day] #=> "17"
# scan
# æ£èŠè¡šçŸã«ãããããéšåãé
åã«å
¥ããŠè¿ã
'123 456 789'.scan(/\d+/) #=> ["123", "456", "789"]
'1977幎7æ17æ¥ 2016幎12æ31æ¥'.scan(/\d+幎\d+æ\d+æ¥/) #=> ["1977幎7æ17æ¥", "2016幎12æ31æ¥"]
# []
# æ£èŠè¡šçŸã«ãããããéšåãæãåºã
text = 'éµäŸ¿çªå·ã¯123-4567ã§ã'
text[/\d{3}-\d{4}/] #=> "123-4567"
# sliceã¯[]ã®ãšã€ãªã¢ã¹ã¡ãœãã
text.slice(/\d{3}-\d{4}/) #=> "123-4567"
# slice!ã«ãããšãããããéšåãæååããç Žå£çã«åãé€ããã
text.slice!(/\d{3}-\d{4}/) #=> "123-4567"
text#=> "éµäŸ¿çªå·ã¯ã§ã"
# split
# ãããäœãããæååãåºåãæåã«ããŠæååãåè§£ããé
åãšããŠè¿ã
text = '123,456-789'
# æååã§åºåãäœçœ®ãæå®ãã
text.split(',')
text.split(/,|-/)
# gsub
# 第1åŒæ°ã®æ£èŠè¡šçŸã«ãããããæååã第2åŒæ°ã®æååã§çœ®ãæãã
text = '123,456-789'
text.gsub(',',':')
text.gsub(/,|-/,':')
# caseæã§æ£èŠè¡šçŸã䜿ã
text = '03-1234-5678'
case text
when /^\d{3}-\d{4}$/
puts 'éµäŸ¿çªå·ã§ã'
when /^\d{4}\/\d{1,2}\/\d{1,2}$/
puts 'æ¥ä»ã§ã'
when /^\d+-\d+-\d+$/
puts 'é»è©±çªå·ã§ã'
end
####################################
# yield => ã¡ãœããæã«æž¡ããããããã¯ã®åŠçãåŒã³åºã
####################################
def greeting
puts 'ãã¯ãã'
# ããã§ãããã¯ã®åŠçãåŒã³åºã
yield
puts 'ããã°ãã¯'
end
greeting do
puts 'ããã«ã¡ã¯'
end
#=> ãã¯ãã
# ããã«ã¡ã¯
# ããã°ãã¯
####################################
# ãããã¯ãæž¡ããããã©ããã倿ããå Žåã¯block_given?ã¡ãœããã䜿çš
####################################
def greeting
puts 'ãã¯ãã'
# ãããã¯ãæž¡ãããå Žåã®ã¿yieldãåŒã³åºã
if block_given?
yield
end
puts 'ããã°ãã¯'
end
greeting
#=> ãã¯ãã
# ããã°ãã¯
greeting do
puts 'ããã«ã¡ã¯'
end
#=> ãã¯ãã
# ããã«ã¡ã¯
# ããã°ãã¯
####################################
# Proc => ãããã¯ããªããžã§ã¯ãåããããã®ã¯ã©ã¹
####################################
# "Hello!"ãšããæååãè¿ãProcãªããžã§ã¯ããäœæãã
hello_proc = Proc.new do
'Hello!'
end
# do ... endã®ãããã«{}ã䜿ã£ãŠããã
hello_proc = Proc.new { 'Hello!' }
# Procãªããžã§ã¯ããå®è¡ããïŒæååãè¿ãïŒ
hello_proc.call #=> "Hello!"
####################################
# ãããã¯ã®ä»£ããã«Procãªããžã§ã¯ããã¡ãœããã®åŒæ°ã«æž¡ã
####################################
def greeting(&block)
puts 'ãã¯ãã'
text = block.call('ããã«ã¡ã¯')
puts text
puts 'ããã°ãã¯'
end
# Procãªããžã§ã¯ããäœæããããããããã¯ã®ä»£ãããšããŠgreetingã¡ãœããã«æž¡ã
repeat_proc = proc { |text| text * 2 }
greeting(&repeat_proc)
#=> ãã¯ãã
# ããã«ã¡ã¯ããã«ã¡ã¯
# ããã°ãã¯
####################################
# Proc.newãšã©ã ãã®éã
####################################
# Proc.newã®å Žå
# åŒæ°ãnilã§ãå ç®ã§ããããã«to_iã¡ãœããã䜿ã
add_proc = Proc.new { |a, b| a.to_i + b.to_i }
# Proc.newã¯åŒæ°ã1ã€ãŸãã¯3ã€ã§ãåŒã³åºããå¯èœ
add_proc.call(10) #=> 10
add_proc.call(10, 20, 100) #=> 30
# ã©ã ãã®å Žå
add_lambda = ->(a, b) { a.to_i + b.to_i }
# ã©ã ãã¯åæ°ã«ã€ããŠå³å¯ãªã®ã§ãåŒæ°2åã§ãªããã°ãšã©ãŒã«ãªã
add_lambda.call(10)
#=> ArgumentError: wrong number of arguments (given 1, expected 2)
add_lambda.call(10, 20, 30)
#=> ArgumentError: wrong number of arguments (given 3, expected 2)
# Timeã¯ã©ã¹ã§æ¥æã衚ããªããžã§ã¯ããäœæãã
# requireãªãã§æè»œã«äœ¿ããããµããŒã¿ã€ã ãéå¹Žãæ±ããã2038幎åé¡è§£æ±ºæžã
time = Time.new(2017, 1, 31, 23, 30, 59) #=> 2017-01-31 23:30:59 +0900
# dateã©ã€ãã©ãªãrequireãããšDateã¯ã©ã¹ãšDateTimeã¯ã©ã¹ã䜿ããããã«ãªã
require 'date'
# Dateã¯ã©ã¹ã§æ¥ä»ã衚ããªããžã§ã¯ããäœæãã
date = Date.new(2017, 1, 31) #=> #<Date: 2017-01-31 ((2457785j,0s,0n),+0s,2299161j)>
# DateTimeã¯ã©ã¹ã§æ¥æã衚ããªããžã§ã¯ããäœæãã
date_time = DateTime.new(2017, 1, 31, 23, 30, 59)
#=> #<DateTime: 2017-01-31T23:30:59+00:00 ((2457785j,84659s,0n),+0s,2299161j)>
ãã¡ã€ã«ã»ãã£ã¬ã¯ããª
# ã«ã¬ã³ããã£ã¬ã¯ããªã«"secret.txt"ãååšãããïŒ
File.exists?('./secret.txt')
# ã«ã¬ã³ããã£ã¬ã¯ããªã«"secret_folder"ãååšãããïŒ
Dir.exists?('./secret_folder')
###################################
# FileUtilsã¯åºæ¬çãªãã¡ã€ã«æäœããã€ããã¢ãžã¥ãŒã«
###################################
require 'fileutils'
# libãã£ã¬ã¯ããªã®hello_world.txtãhello_world.rbã«ç§»åïŒãªããŒã ïŒãã
FileUtils.mv('./lib/hello_world.txt', './lib/hello_world.rb')
###################################
# PathNameã¯ãã¹åããªããžã§ã¯ãæåãããæ±ãã¯ã©ã¹
###################################
require 'pathname'
# ã«ã¬ã³ããã£ã¬ã¯ããªé
äžã«ããlibãã£ã¬ã¯ããªã衚ããªããžã§ã¯ããäœã
lib = Pathname.new('./lib')
# ãã¡ã€ã«ãïŒ
lib.file? #=> false
# ãã£ã¬ã¯ããªãïŒ
lib.directory? #=> true
# libãã£ã¬ã¯ããªé
äžã«ããsample.txtãžã®ãã¹æååãäœã
# ïŒåºåãæåã®ã¹ã©ãã·ã¥ã¯èªåçã«ä»äžãããïŒ
lib.join('sample.txt').to_s #=> "./lib/sample.txt"
##############
# CSV
##############
require 'csv'
# CSVãã¡ã€ã«ã®åºå
CSV.open('./lib/sample.csv', 'w') do |csv|
# ãããè¡ãåºåãã
csv << ['Name', 'Email', 'Age']
# æçްè¡ãåºåãã
csv << ['Alice', '[email protected] ', 20]
end
# ã¿ãåºåãã®CSV(TSV)ãã¡ã€ã«ãèªã¿èŸŒã
CSV.foreach('./lib/sample.tsv', col_sep: "\t") do |row|
# åè¡ã«ã€ããŠã1åç®ãã3åç®ã®å€ãã¿ãŒããã«ã«è¡šç€ºãã
puts "1: #{row[0]}, 2: #{row[1]}, 3: #{row[2]}"
end
##############
# JSON
##############
# jsonã©ã€ãã©ãªãrequireãããšé
åãããã·ã¥ã§to_jsonã¡ãœããã䜿ããããã«ãªã
require 'json'
user = { name: 'Alice', email: '[email protected] ', age: 20 }
# ããã·ã¥ãJSON圢åŒã®æååã«å€æããïŒRubyã®ããã·ã¥ã«äŒŒãŠãããããã¯JSON圢åŒïŒ
user_json = user.to_json
puts user_json #=> {"name":"Alice","email":"[email protected] ","age":20}
# JSONæååãããŒã¹ããŠããã·ã¥ã«å€æããïŒããŒã¯ã·ã³ãã«ã§ã¯ãªãæååã«ãªãïŒ
JSON.parse(user_json) #=> {"name"=>"Alice", "email"=>"[email protected] ", "age"=>20}
##############
# YAML
##############
require 'yaml'
# YAML圢åŒã®ããã¹ãããŒã¿ãçšæãã
yaml = <<TEXT
alice:
name: 'Alice'
email: '[email protected] '
age: 20
TEXT
# YAMLããã¹ããããŒã¹ããŠããã·ã¥ã«å€æãã
users = YAML.load(yaml) #=> {"alice"=>{"name"=>"Alice", "email"=>"[email protected] ", "age"=>20}}
# ããã·ã¥ã«æ°ããèŠçŽ ã远å ãã
users['alice']['gender'] = :female
# ããã·ã¥ããYAMLããã¹ãã«å€æãã
puts YAML.dump(users)
#=> ---
# alice:
# name: Alice
# email: [email protected]
# age: 20
# gender: :female
# byebugã®ã€ã³ã¹ããŒã«
gem install byebug
# ãã®è¡ãå®çŸ©ãã以éããããã°ããã
require 'byebug'
byebug
# Byebugã³ãã³ã
eval + (åŒ) 倿°ã®å€ãã¡ãœããã®æ»ãå€ã衚瀺ãã
s ã¹ãããã€ã³
n ã¹ããããªãŒããŒ
fin ã¹ãããã¢ãŠã
c åŠçåé
help 䜿çšå¯èœã³ãã³ããšèª¬æã®è¡šç€º
q Byebugçµäº