####ブロック
配列と範囲はいずれも、ブロックを伴うさまざまなメソッドに対して使える。
>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
(1..5)に対してeachメソッドを呼び出す。
メソッドに渡されている{ |i| puts 2 * i }が、ブロックと呼ばれる部分
|i|では変数名が縦棒「|」に囲まれている。 ブロック変数に対して使うRubyの構文
範囲オブジェクトのeachメソッドは、iという1つのローカル変数を使ってブロックを操作
>> (1..5).each do |i|
?> puts 2 * i
>> end
2
4
6
8
10
=> 1..5
短い1行のブロックには波カッコを使う。
長い1行や複数行のブロックにはdo..end記法
iの代わりにnumberを使っている。
この変数(ブロック変数)の名前は固定されていません。
>> 3.times { puts "Betelgeuse!" } # 3.timesではブロックに変数を使っていない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3
>> (1..5).map { |i| i**2 } # 「**」記法は冪乗 (べき乗)
=> [1, 4, 9, 16, 25]
>> %w[a b c] # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
######テストがブロックなっている
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Ruby on Rails Tutorial Sample App"
end
テストコードにdoというキーワードがあることに気付き
そこからテストの本体が「そもそもブロックでできている
###演習
1.2乗にせよ
>> (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
2.メソッドを定義してメソッドを使え。
>> def yeller(s)
>> s.join.upcase
>> end
=> :yeller
>> yeller(['o', 'l', 'd'])
=> "OLD"
mapを使いきれなかった。 一応書いてみた。
3.メソッドを定義して、メソッドを使え。
>> def random_subdomain
>> b = ("a".."z").to_a.shuffle[0..15].join
>> puts b
>> end
=> :random_subdomain
>> random_subdomain
uztpyrijhcvesxnl
=> nil
一応できたと思う。
4.コードを書き換えろ
>> def string_shuffle(s)
>> s.split('').shuffle.join
>> end
=> :string_shuffle
>> string_shuffle("foobar")
=> "arfoob"
>> string_shuffle("foobar")
=> "ooabfr"
>> string_shuffle("foobar")
=> "bfooar"