1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby2.1技術者認定試験 Silver(s.size問題解説)

Last updated at Posted at 2023-05-30
lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| s.size > i ? s.size : i}
puts result

Q.何と出力されるかという問題

【解説】

今回は、使うメソッドや演算子の基本の形をまずみていきます。

○injectメソッド

配列.inject(初期値){|1引数, 2引数| 処理}
💡 ブロックの第1引数は初回のみ、injectメソッドの引数(初期値)が入る。2回目以降は前回のブロックの戻り値が入る。ブロックの第2引数は配列の各要素が順番に入ります。ブロックの戻り値は次の回に引き継がれ、ブロックの第1引数に入ります。繰り返し処理が最後まで終わると、ブロックの戻り値がinjectメソッドの戻り値となります。

参考:プロを目指す人ののためのRuby入門[改訂2版]p429伊藤淳一 技術評論社
○条件演算子(三項演算子)

 ? 真だった場合の処理 : 偽だった場合の処理 

参考:プロを目指す人ののためのRuby入門[改訂2版]p67伊藤淳一 技術評論社
○sizeメソッド

"文字列".size

で、文字列の文字数を返します。

上記injectメソッドと条件演算子(三項演算子)、sizeメソッドの問題です。

lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| s.size > i ? s.size : i}
puts result
lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| 

部分は、

1回目のループではiに初期値0が入り、配列langの最初の要素”python”がsに入ります。

次に|i, s| s.size > i ? s.size : iの処理をします。これはsの文字数がiより大きければ、sの文字数を返し、そうでなければ、iの文字数を返す、といった処理です。

[1回目のループ処理内容]

1回目のループではiに初期値0が入り、配列langの最初の要素の”python”がsに入ります。

次に”python”の文字数(つまり6)とi(つまり0)を比べます。

s.size > iは、6>0となるので、真です。なので戻り値は6となります。

[2回目のループ処理内容]

2回目のループでは、iに6が入り、、配列langの2番目の要素の”ruby”がsに入ります。

次に”ruby”の文字数(つまり4)とi(つまり6)を比べます。

s.size > iは、4>6となるので偽です。なので戻り値は6となります。

[3回目のループ処理内容]

3回目のループでは、iに6が入り、、配列langの3番目の要素の”perl”がsに入ります。

次に”perl”の文字数(つまり4)とi(つまり6)を比べます。

s.size > iは、4>6となるので偽です。なので戻り値は6となります。

この処理を繰り返すと最も文字数の多い文字列の文字数が戻り値となります。

つまり、配列langの中で最も文字数の多い、resultの文字数の6が戻り値になります。

A.6

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?