Open saran12345678 opened 2 weeks ago
irb(main):016> "racecar".length
=> 7
irb(main):017> carName = "racecar"
=> "racecar"
irb(main):019> carName.reverse
=> "racecar"
irb(main):020> s = "racecar"
=> "racecar"
irb(main):021> s == s.reverse
=> true
リスト4.8 >> puts "It's a palindrome!" if s == s.reverse
リバースしても同じ文字列であるためTrueとなりPutsが実行される
irb(main):023> puts "It's a palindrome!" if s == s.reverse
It's a palindrome!
=> nil
変数sの値を更新すると、リバース時に別の文字列になってしまうためputsが実行されなくなる。
irb(main):024> s = "onomatopoeia"
=> "onomatopoeia"
irb(main):025> puts "It's a palindrome!" if s == s.reverse
=> nil
リスト4.9
>> def palindrome_tester(s)
>> if (コードを書き込む)
>> puts "It's a palindrome!"
>> else
>> puts "It's not a palindrome."
>> end
>> end
irb(main):036* def palindrome_tester(s)
irb(main):037* if s == s.reverse
irb(main):038* puts "It's a palindrome!"
irb(main):039* else
irb(main):040* puts "It's not a palindrome."
irb(main):041* end
irb(main):042> end
=> :palindrome_tester
irb(main):043> palindrome_tester("racecar")
It's a palindrome!
=> nil
irb(main):044> palindrome_tester("onomatopoeia")
It's not a palindrome.
=> nil
trueが返るため、palindrome_testerの戻り値がnilだとわかる。
irb(main):045> palindrome_tester("racecar").nil?
It's a palindrome!
=> true
irb(main):046> a = "A man, a plan, a canal, Panama".split(", ")
=> ["A man", "a plan", "a canal", "Panama"]
irb(main):047> s = a.join
=> "A mana plana canalPanama"
irb(main):050> palindrome_tester(s.split(" ").join)
It's not a palindrome.
=> nil
irb(main):051> palindrome_tester(s.split(" ").join.downcase)
It's a palindrome!
=> nil
先頭からの場合はゼロオリジンを意識する。 逆に語尾からの場合は、−1から始まるため-6ではなく-7が正しい。
irb(main):056> alphaArr = ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
irb(main):057> alphaArr[6]
=> "g"
irb(main):058> alphaArr[-7]
=> "t"
irb(main):059> (0..16).each {|i| puts i**2}
0
1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256
=> 0..16
irb(main):001* def yeller(s)
irb(main):002* return s.map(&:upcase).join
irb(main):003> end
=> :yeller
irb(main):004> yeller(['o', 'l', 'd'])
=> "OLD"
リスト4.11
>> def string_shuffle(s)
>> s.?('').?.?
>> end
>> string_shuffle("foobar")
=> "oobfra"
irb(main):005* def string_shuffle(s)
irb(main):006* s.split('').shuffle.join
irb(main):007> end
=> :string_shuffle
irb(main):008> string_shuffle("foobar")
=> "aoofrb"
irb(main):009> hash = {"one":"uno", "two":"dos", "three":"tres"}
=> {:one=>"uno", :two=>"dos", :three=>"tres"}
irb(main):019* hash.each do |key, value|
irb(main):020* puts "#{key.inspect}はスペイン語で#{value.inspect}"
irb(main):021> end
:oneはスペイン語で"uno"
:twoはスペイン語で"dos"
:threeはスペイン語で"tres"
=> {:one=>"uno", :two=>"dos", :three=>"tres"}
irb(main):001> person = {first:"yama", last:"taro"}
=> {:first=>"yama", :last=>"taro"}
irb(main):002> person1 = {first:"yama", last:"taro"}
=> {:first=>"yama", :last=>"taro"}
irb(main):003> person2 = {first:"kawa", last:"jiro"}
=> {:first=>"kawa", :last=>"jiro"}
irb(main):004> person3 = {first:"umi", last:"third"}
=> {:first=>"umi", :last=>"third"}
irb(main):005> params = []
=> []
irb(main):006> params = {}
=> {}
irb(main):007> params[:father] = person1
=> {:first=>"yama", :last=>"taro"}
irb(main):008> params[:mother] = person2
=> {:first=>"kawa", :last=>"jiro"}
irb(main):009> params[:child] = person3
=> {:first=>"umi", :last=>"third"}
irb(main):010> params[:father][:first] == person1[:first]
=> true
irb(main):011> params[:father] == person1
=> true
irb(main):012> user = {name:"toby", email:"testAddress", password_digest:"****"}
=> {:name=>"toby", :email=>"testAddress", :password_digest=>"****"}
次のコード
{ "a" => 100, "b" => 200 }.merge({ "b" => 300 })
マージされることでKey:bが300となるため、{ "a":"100", "b":"300" }となる
{"a"=>100, "b"=>300}
変数に対しシンボルはメモリが重複しない。 また、整数値で比較が行われるため変数に対して高速になる。
下記のコード
require 'benchmark'
symbol = { :foo => "value" }
string = { "foo" => "value" }
integer = { 1 => "value" }
Benchmark.benchmark do |x|
x.report("Symbol") { symbol[:foo] }
x.report("String") { string["foo"] }
x.report("Integer") { integer[1] }
end
結果
[#<Benchmark::Tms:0x0430b2c8
@cstime=0.0,
@cutime=0.0,
@label="Symbol",
@real=5.000000001587068e-06,
@stime=0.0,
@total=2.0000000006348273e-05,
@utime=2.0000000006348273e-05>,
#<Benchmark::Tms:0x0430af30
@cstime=0.0,
@cutime=0.0,
@label="String",
@real=5.000000001587068e-06,
@stime=0.0,
@total=9.999999988963282e-06,
@utime=9.999999988963282e-06>,
#<Benchmark::Tms:0x0430aa08
@cstime=0.0,
@cutime=0.0,
@label="Integer",
@real=5.000000001587068e-06,
@stime=0.0,
@total=5.000000001587068e-06,
@utime=5.000000001587068e-06>]
irb(main):002> a = 1..10
=> 1..10
irb(main):003* a.each do |i| puts i
irb(main):004> end
1
2
3
4
5
6
7
8
9
10
=> 1..10
irb(main):006> r = Range.new(1, 10)
=> 1..10
irb(main):001> a = 1..10
=> 1..10
irb(main):002> r = Range.new(1, 10)
=> 1..10
irb(main):003> a == r
=> true
irb(main):011> r = Range.new(1, 2)
=> 1..2
irb(main):012> r.class
=> Range
irb(main):013> r.class.superclass
=> Object
irb(main):014> r.class.superclass.superclass
=> BasicObject
irb(main):015> r.class.superclass.superclass.superclass
=> nil
Objectの親クラスはRangeにて確認済みのため省略
irb(main):016> h = Hash.new
=> {}
irb(main):017> h.class
=> Hash
irb(main):018> h.class.superclass
=> Object
irb(main):021> s = :symbol
=> :symbol
irb(main):022> s.class
=> Symbol
irb(main):023> s.class.superclass
=> Object
irb(main):024* class Word < String
irb(main):025* def palindrome?
irb(main):026* self == reverse
irb(main):027* end
irb(main):028> end
=> :palindrome?
irb(main):029> word = Word.new("abcdedcba")
=> "abcdedcba"
irb(main):030> word.palindrome?
=> true
irb(main):032> String.class.superclass
=> Module
irb(main):033> word = Word.new("racecar")
=> "racecar"
irb(main):034> word.palindrome?
=> true
irb(main):035> word = Word.new("onomatopoeia")
=> "onomatopoeia"
irb(main):036> word.palindrome?
=> false
irb(main):037> word = Word.new("Malayalam".downcase)
=> "malayalam"
irb(main):038> word.palindrome?
=> true
リスト4.15
>> class String
>> def shuffle
>> self.?('').?.?
>> end
>> end
>> "foobar".shuffle
=> "borafo"
irb(main):039* class String
irb(main):040* def shuffle
irb(main):041* self.split("").shuffle.join
irb(main):042* end
irb(main):043> end
=> :shuffle
irb(main):044> "foobar".shuffle
=> "farboo"
irb(main):045* class String
irb(main):046* def shuffle
irb(main):047* split("").shuffle.join
irb(main):048* end
irb(main):049> end
=> :shuffle
irb(main):050> "foobar".shuffle
=> "fobaor"
irb(main):001> user = User.new
=> #<User:0x00006fff671ac238 id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):003> user.class.superclass
=> ApplicationRecord(abstract)
irb(main):004> user.class.superclass.superclass
=> ActiveRecord::Base
irb(main):005> user.class.superclass.superclass.superclass
=> Object
irb(main):007> example.first_name
=> nil
irb(main):008> example.first_name = "abc"
=> "abc"
irb(main):009> example.last_name
=> nil
irb(main):010> example.last_name = "def"
=> "def"
irb(main):011> example.email = "example.com"
=> "example.com"
irb(main):012> example.formatted_email
=> "abc def <example.com>"
irb(main):007> user.first_name = "first"
=> "first"
irb(main):008> user.last_name = "last"
=> "last"
irb(main):009> user.email = "userEmail"
=> "userEmail"
irb(main):011> user.alphabetical_name
=> "last, first"
irb(main):012> user.full_name.split == user.alphabetical_name.split(', ').reverse
=> true
city変数に適当な市区町村名を、prefecture変数に適当な都道府県名を代入してください。
先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です。)
タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
エスケープされるため、タブではなく文字列として出力される。