2017-08-18 16 views
-1

私は学生数を出力する三項演算子を持っています。未定義のメソッド 'center' for nilclass

@students.count < 2 ? puts("Now we have #{@students.count} student").center(75) : puts("Now we have #{@students.count} students").center(75) 

私はそれ以外の場合はエラーとして出てくるでしょうプットの後の括弧内の文字列を入れていた:

syntax error, unexpected ':', expecting end-of-input 

しかし、私はこれに動作していない.center私の方法を自分のコードを更新しましたので、このエラーが表示されます:

`input_students': undefined method `center' for nil:NilClass (NoMethodError) 

この場合、角かっこで回避できますか?

+0

ここではternaryを使用しないでください。ifを使用してください。また、 'puts'の結果に' center'を適用しています。それを文字列に適用します。 –

+0

前にifステートメントがありましたが、私はリファクタリングしたかったのです。 – Benjamints

+0

あなたはそれが今より良く読むと思いますか? –

答えて

0

Kernel.putsメソッドは常にnilを返します。

おそらく、代わりにこれをしたい:

個人的に
puts((@students.count < 2 ? "Now we have #{@students.count} student" : "Now we have #{@students.count} students").center(75)) 

、私のような何かを書くと思います:

message= "Now we have #{@students.count} student" 
message << 's' if @students.count > 1 
puts(message.center(75)) 
+0

あなたの好みのコードは、オリジナルよりもコンパクトでDRYのままですが、まだメンテナンスの悪夢です:) –

+0

例:テンプレートが ' "今、このクラスの学生には#{@students.count}の生徒がいます" "? –

+0

例:別の言語をサポートする必要がある場合や、多彩な複数化ルールを使用する場合はどうなりますか? –

1

問題は、あなたがputsの結果に#centerへの呼び出しを適用しているということですある場合はnil

@students.count < 2 ? puts("Now we have #{@students.count} student".center(75)) : puts("Now we have #{@students.count} students".center(75)) 

注:学生のカウントが0であれば、あなたのメッセージは、「今、私たちは0学生を持っている」読み

あなたがリファクタリングしたいなら、あなたは共通部分を抽出できます。

message = count < 2 ? 'message 1' : 'message 2' 
puts message.center(75) 

が、この意志を中心にして出力します結果はまだ長い行(メッセージによって異なる)になりますので、

message = if count < 2 
      'message 1' 
      else 
      'message 2' 
      end 
puts message.center(75) 

私見コードは常に短いと同じではありませんどの読めるする必要があります使用することができます。特に、1つの行に多くの文が詰まっている場合。

関連する問題