質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

616閲覧

[n % 4]の処理について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/02/13 02:47

#seedでstaffmemberを増やす処理

以下の記述についてです。
[n % 4][n % 5]この記載ですが変数のnはイテレータとして0~20が入ると認識していますが
[n%4]ここの処理がわかりません。なぜ4で割ったり5で割ったりしているのでしょうか?

20.times do |n| fn = family_names[n % 4].split(":") gn = given_names[n % 5].split(":") end
StaffMember.create!( email: "taro@example.com", family_name: "山田", given_name: "太郎", family_name_kana: "ヤマダ", given_name_kana: "タロウ", password: "password", start_date: Date.today ) family_names = %w{ 佐藤:サトウ:sato 鈴木:スズキ:suzuki 高橋:タカハシ:takahashi 田中:タナカ:tanaka } given_names = %w{ 二郎:ジロウ:jiro 三郎:サブロウ:saburo 松子:マツコ:matsuko 竹子:タケコ:takeko 梅子:ウメコ:umeko } 20.times do |n| fn = family_names[n % 4].split(":") gn = given_names[n % 5].split(":") StaffMember.create!( email: "#{fn[2]}.#{gn[2]}@example.com", family_name: fn[0], given_name: gn[0], family_name_kana: fn[1], given_name_kana: gn[1], password: "password", start_date: (100 - n).days.ago.to_date, end_date: n == 0 ? Date.today : nil, suspended: n == 1 ) end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これは、サンプル例が少し直感的にイメージしにくいと思います。
限定的な場合に適用できるような処理かと思います。

もともとの処理の期待されるところは、姓と名の組み合わせ4×5=20個を、テスト用データとして用意したい、という感じなのではないでしょうか。

ただ、たとえば姓は4個のままで、名前の個数が6個に増えたとして、5の部分を6に修正して4×6=24回ループ処理を回しても、期待するような姓名の組み合わせ24通りは作れないアルゴリズムです。
そのため分かりにくいのも、自然かもしれません。

処理の違いをわかりやすく目で終えるように、処理を取り出して、書き換えてみました。
どちらも姓と名の20通りの組み合わせを端末に出力します。

ruby

1#! /usr/bin/env ruby 2 3family_names = %w{ 4 佐藤:サトウ:sato 5 鈴木:スズキ:suzuki 6 高橋:タカハシ:takahashi 7 田中:タナカ:tanaka 8} 9 10given_names = %w{ 11 二郎:ジロウ:jiro 12 三郎:サブロウ:saburo 13 松子:マツコ:matsuko 14 竹子:タケコ:takeko 15 梅子:ウメコ:umeko 16 悦子:エツコ:etuko 17} 18 194.times do |n| 20 5.times do |m| 21 fn = family_names[n].split(":") 22 gn = given_names[m].split(":") 23 puts fn[0] + " " + gn[0] 24 end 25end

ruby

1#! /usr/bin/env ruby 2 3family_names = %w{ 4 佐藤:サトウ:sato 5 鈴木:スズキ:suzuki 6 高橋:タカハシ:takahashi 7 田中:タナカ:tanaka 8} 9 10given_names = %w{ 11 二郎:ジロウ:jiro 12 三郎:サブロウ:saburo 13 松子:マツコ:matsuko 14 竹子:タケコ:takeko 15 梅子:ウメコ:umeko 16 悦子:エツコ:etuko 17} 18 1920.times do |n| 20 fn = family_names[n % 4].split(":") 21 gn = given_names[n % 5].split(":") 22 puts fn[0] + " " + gn[0] 23 end 24end

上のコードでは、2つのループに分けています。データの数が変化すれば、ループの数もそれに合わせれば、必要な組み合わせのデータを出力できるかと思います。
もともとのコードと出力される順番は異なりますので、そこが違うところです。

元の処理は、姓と名の組み合わせを順列のずれを利用していて、4と5という組み合わせだから、全ての組み合わせが出力できるともいえます。これは直感的ではない操作をしているといっていいかもしれません。
分かりにくいコードだと思います。
もしこういった処理があるときには、コードに説明を書いておくべきかと思います。
解説を書く、くらいのつもりで、説明を書いておきましょう。
数学でいうところの、行列の処理が得意な人じゃないと、イメージしにくいかと思います。

投稿2021/02/13 06:37

編集2021/02/13 06:45
phoepsilonix

総合スコア233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/13 08:56

コードの書き直しありがとうございます!わかりやすく直感的に理解できました。 こちらを使っていきたいと思います!
guest

0

なぜ4で割ったり5で割ったりしているのでしょうか?

正確には4や5で割った余りを取得しています。

配列family_namesの長さが4なので、そこから値を取得するにはインデックスは
0から3の間である必要があります。
そのためnを4で割った余りをインデックスにしているわけです。

追記

すいません。例えば0÷4をしているということでしょうか?

はい、0÷4から19÷4の(余りのある)割り算をしています。

インデックスにするというところがいまいちピンときていません。

例えばfamily_names[2]とすると2番目が取り出せるし、family_names[2 * 2]とすると4番目が取り出せるのは分かりますでしょうか?
今回もそれと同じことです。family_names[1 % 4]とすれば1%4 === 1なので1番目が取り出せます。

投稿2021/02/13 03:02

編集2021/02/13 03:35
Masa-Shin

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/13 03:16

ありがとうございます! インデックスが0から3で取り出せるのはわかったのですが、 > そのためnを4で割った余りをインデック > スにしているわけです。 すいません。例えば0÷4をしているということでしょうか? インデックスにするというところがいまいちピンときていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問