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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

1646閲覧

コードが理解できません。当方、プログラミング超初心者です。

H-JURI

総合スコア42

Ruby

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2015/10/30 05:32

Rubyをベースにプログラミングを学んでいる超初心者です。ある課題の解答が理解できなくて苦しんでいます。まず自分自身の認識を#の後に書きます。??が入っているところがわからないところです。

Ruby

1# Write a method that takes in a number and returns a string, placing 2# a single dash before and after each odd digit. There is one 3# exception: don't start or end the string with a dash. 4# 5# You may wish to use the `%` modulo operation; you can see if a number 6# is even if it has zero remainder when divided by two. 7# 8# Difficulty: medium. 9 10def dasherize_number(num) 11 num_s = num.to_s **#num_sを文字化する??・・・①** 12 result = "" **#resultという変数を作る??・・・②** 13 14 idx = 0 #idxが文字の長さより短い間以下を繰り返す。 15 while idx < num_s.length 16 digit = num_s[idx].to_i #digitにidx番目の文字を数字化して代入する 17 18 if idx > 0 19 pre_digit = num_s[idx - 1].to_i #もしidxが0より大きい場合、pre_digitにidx-1番目の文字を数字化して代入する 20 21 if (pre_digit % 2 == 1) || (digit % 2 == 1) #もしpre_digit,digitが奇数だった場合 22 result += "-" #resultに-を代入する 23 end 24 25 end #一つ目のifを終わる 26 result += num_s[idx] #resultにidx番目の文字を代入する 27 28 idx += 1 #次の文字を検証する 29 end 30 31 return result 32 33end

それでは質問させていただきます。

なぜnum_sというものを使わなければならないのでしょうか。実際numで実行してみたところうまくいきませんでした。


result = の後の""はどういった意味があるのでしょうか。

以上の二つが調べても理解ができなかったのでご教授願います。

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

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

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

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

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

guest

回答3

0

Ruby 使ったことないですが、
①なぜnum_sというものを使わなければならないのでしょうか。実際numで実行してみたところうまくいきませんでした。
→ num は数値型なので文字列として扱えないからですね。num_s へ文字列として代入して
1文字ずつ処理する為にnum_s が必要になります。
仮に num = "12345" のデータが引数としてわたってきた場合は、num で処理できますが

②result = の後の""はどういった意味があるのでしょうか。
→ これは、初期化しているだけだと思います。

投稿2015/10/30 05:49

trick

総合スコア366

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

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

H-JURI

2015/10/30 06:35

回答ありがとうございます! 参考にさせていただきます
guest

0

①Rubyは「型」を隠してしまっているものがあるので最初のうちはわかりにくいかもしれませんが,
このプログラムでは,numとnum_sは型が違います(正確には,違う可能性があります).
numはどんな型かはわかりませんが,num_sは確実に文字列です.
もしnum1が10という数字(num1 = 10)だった場合,num1[0] = 0,num1[1] = 1,num1[2] = 0,num1[3] = 1,その後0,となります.
これは10を2進数で表した時,下位ビットから見ているということになります.
もしnum2が10という文字(num2 = "10")だった場合,num2[0] = "1",num2[1] = "0",num2[2] = nil,となります.
これは10という文字を先頭から見て,文字の終端にはnilを使っているということになります.
同じ10であっても,整数型なのか文字列型なのかで,配列でアクセスした時に得られる値が変わるわけです.
このプログラムでは数字を10進数で表示することを考えているので,まず文字列型にしてから処理しています.

②resultに""を代入するのは,resultが文字列型であることを宣言するためにあります.
+=演算子は,左側の変数が文字列型か整数型かで挙動が変わります.
文字列なら後方に付け加え,整数なら足します.
"10" + "1" = "101",10 + 1 = 11,なのです.

どちらもデータ型に関する問題なので,そのあたりを調べてみてください.

投稿2015/10/30 06:11

KenTerada

総合スコア751

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

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

H-JURI

2015/10/30 06:32

回答ありがとうございます。 ①に関してなのですがnum_sが文字列ならば、num_sにわざわざnum.to_sを代入する必要性がわかりません。もともと文字列のnum_sになぜ数字のnumを文字列化したnum.to_sを代入するのでしょうか?
guest

0

ベストアンサー

①について

関数の説明に、「数値を引数に取り、文字列を返します」といった感じの文があります。
つまり引数numは「数値」です。
この関数ではnum_sは「文字列」ですので、
文字列用の関数(.lengthとか)を使用しているため、
num_sをnumに変更すると、動作しなくなります。

②について

ダブルクォート2つで囲ったものは、文字列を意味します。
今回はダブルクォートの中に何もないので、
「空文字」という意味です。
文字数0の、空の文字列です。
これは文字列の変数の初期化によく使用されます。

わざわざ空の文字列を代入しているのは、以下の行のためです。
「result += "-"」

上記は、「result = result + "-"」
と同様の意味ですが、resultが初期化されていない場合、
この処理は失敗します。
(初期化していない変数 = 値が不定なので、不定な値に足し算をすることになってしまいます。)


上記②についてコメントにて間違いの指摘がありました。

初期化していない変数はnilとして扱われるようです。
nilは何もない事を表す特別な値ですので、上記回答の中の、
「初期化していない変数 = 値が不定なので、不定な値に足し算をすることになってしまいます。」
は間違いで、
「初期化していない変数 = 何もないので、存在しないものを足し算に使うことになっていまいます。」
が正しい・・・のかな?


コメントを受け追記

num_sについてですが、
num.to_sを代入するまで、文字列の変数ではありません。

型宣言を行わない言語では、変数は初めに代入した値の型を取ります。

ですので、num_s = numとした場合、num_sは数値型になってしまいます。

投稿2015/10/30 05:50

編集2015/10/30 06:52
moredeep

総合スコア1507

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

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

maisumakun

2015/10/30 06:05

Rubyの場合、何もない状態からresult += "-"とすると、resultにnilが入った状態で変数が作られ、それから+=を実行しようとしてエラーになる、という動作をします。初期化が必要というのは間違いないですが、不定値になることはありません。
moredeep

2015/10/30 06:20

nilはnullと同じものだと思っていましたが、なにもないという意味なんですね。 勘違いでした。 回答に加筆します。
H-JURI

2015/10/30 06:34

回答ありがとうございます! ①に関してなのですがnum_sが文字列ならば、num_sにわざわざnum.to_sを代入する必要性がわかりません。もともと文字列のnum_sに、なぜ数字のnumを文字列化したnum.to_sを代入するのでしょうか?
orinoakira

2015/10/30 06:56

>型宣言を行わない言語では、変数は初めに代入した値の型を取ります。 そういう仕様の言語もあるかもしれませんが、rubyはそういう仕様ではないです。
ozwk

2015/10/30 07:03 編集

あなたの以前の質問でもあったように、 num_sの"_s"は別にRuby的に特別な記号とかじゃなくて、"num_s"で1つの変数名です。 num_sは別にHogeでもFooでもXでも何も動作は変わらないです。プログラマが好きに決められるただの名前です。 仮にHogeだったとしたら、あなたの質問は 「Hogeが文字列ならば、Hogeにわざわざnum.to_sを代入する必要性がわかりません。」 となりますよ?
trick

2015/10/30 07:11

型宣言を行わないRuby 等だと、初心者の方には解り辛いのですかね。 慣れれば、解るようになりますよ。
H-JURI

2015/10/30 07:46

>ozwkさん回答ありがとうございます。 def dasherize_number(num)と初めにしていたので"num"は実際に代入される数字の代名詞であり、num_sはその実際の数字を文字列化したものだと認識してました。つまりnum_sとnum.to_sは同じものだと考えていました。 しかしnum_sはnum.to_sを代入しなければ何者でもないということに気づかされました。ありがとうございます!パラメーターなのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問