2017-08-18 23 views
-1

我有一個輸出學生數的三元運算符。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

不要在這裏使用三元,使用'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

您的首選代碼雖然比原始代碼更簡潔,乾燥,但仍然是一個維護噩夢:) –

+0

示例:如果模板更改爲「 「現在我們有#{@students.count}這個班的學生」'? –

+0

例如:如果您需要支持另一種語言,那麼會出現大不相同的複數規則? –

1

問題是,你正在申請調用#centerputs結果碰巧是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) 

恕我直言,代碼需要是可讀的,這並不總是一樣短。特別是當有很多陳述塞進一行時。

相關問題