以下に示す(例1)を実行すると、
hoge
defaultString
と出力されます。
(例1)------------------------------------------------------
def hoge(str)
b=(str||'defaultString') + "\n"
STDOUT.write b
end
hoge("hoge") #hoge
hoge(nil) #defaultString
------------------------------------------------------------
下記に示す例2は、例1の2行目と3行目を1行にまとめたものです。
例1と同じ実行結果を期待しています。
(例2) ----------------------------------------------------
def hoge(str)
STDOUT.write (str||'defaultString') + "\n"
end
hoge("hoge")
hoge(nil)
------------------------------------------------------------
しかし、例2を実行すると、以下の様なエラーが出ました。
------------------------------------------------------------
hogewrite.rb:2:in `+': String can't be coerced into Fixnum (TypeError)
from write.rb:2:in `hoge'
from write.rb:4
------------------------------------------------------------
文法的に、何に違反してるのか、わかりません。
ご指導のほど、宜しくお願いいたします。
No.2ベストアンサー
- 回答日時:
多くの言語では、メソッド呼び出しや関数呼び出しの時に、メソッド名・関数名の後に引数を囲むカッコが必要です。
例: print(1+2)
Rubyでは多くの場合、カッコを省略できます。
例: print 1+2
さて、カッコにはこの他に、演算の順序を変えるためのカッコがあります。例:(1+2)/3
メソッド名の後にカッコがある場合、演算の順序を変えるためのカッコなのか、メソッド引数をくくるカッコなのか???
Rubyは、引数をくくるカッコとみなして解釈しようとします。そうじゃなくて演算の順序を変えるカッコのときは、引数をくくるカッコは省略できません。
例:誤: print(1+2)/3 #=> エラー
→ こう見なされている: (print(1+2)) / 3 #=> printの返す結果を3で割ろうとして、割れないのでエラー ***1
例:正: print((1+2)/3)
>文法的に、何に違反してるのか、わかりません。
文法と言うより実行時のエラーです。writeは出力した文字数を返すので str が "hoge" の場合、STDOUT.write(str||'defaultString') は 4 を返します。次に、4 + "\n" を実行しようとして、「文字列と整数は足せない」というエラーになっている。エラーメッセージの corce というのはここでは「(計算できるように値を)変換する」という意味です。
さて、上の ***1 では、わざとエラーになる例にしましたが、
例:STDOUT.write(1+2)/3
はエラーになりません。どうなるかわかりますか?
なお、改行付きで出力したい場合は、puts を使うと便利です。
def hoge(str)
puts str||'defaultString'
end
notnotさん、ご回答ありがとうございます。
とても解りやすい説明でした。
>例:STDOUT.write(1+2)/3
>はエラーになりません。どうなるかわかりますか?
()の中の1+2の演算結果が出力されて、writeの戻り値である『1』が3で割られたって事ですね。
以下を実行して検証しました。
ret=STDOUT.write(1+2)/3.0 #=>3
puts
puts ret #=> 0.333333333333333
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- PostgreSQL 【PostgreSQL】行の値の並びを変えるには 1 2023/03/21 16:46
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- JavaScript ifreamをリロードしたい 1 2022/05/03 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あせんうぶり言語
-
(再質問)エクセルのマクロボ...
-
パソコンのスクリーンセーバー...
-
これらは書誌情報だと思うので...
-
pythonエラー
-
英数字を含む文字列(0-9,A-Z)...
-
Beautiful Soupのインストール...
-
VBScriptでExcel(2019)上のデー...
-
100万件越えCSVから条件を満た...
-
rubyでじゃんけんのプログラム...
-
Accessで文字列のバイト数読み込み
-
ビーリアルのユーザー名を変え...
-
教えてください
-
Ruby on railsをrails sで立ち...
-
C言語の入力した文字を反転させ...
-
符号付整数の演算結果を答えよ ...
-
実行時エラー450:引数の数が一...
-
情報の表現。()内がどうしても...
-
pythonのerrorコード
-
三項でたとえば交換って
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Rubyの超初心者です。「戻り値r...
-
【BrowseForFolderでデスクトッ...
-
python return 関数
-
【引数と戻り値の違い】 はじめ...
-
CloseとQuitについて
-
再帰に関する質問です。
-
ブロックつきメソッドやyield文...
-
railsチュートリアル5章の演習
-
ぱいソン
-
rubyでのproc
-
【Ruby】 文法的に何が悪いの...
-
Rubyにインクリメンタル演算子...
-
ハッシュ(単語数を数える) た...
-
Ruby 自作メソッドのブロック...
-
レコードセットオブジェクトの...
-
Ruby Fileクラスについて
-
timesの使いどころ
-
ジェネレーターとはなんですか?
-
Unixのwcコマンドの簡易版ですが
-
自作したメソッド・・・こんな...
おすすめ情報