nilclass的未定义方法'center'

时间:2017-08-18 12:49:53

标签: ruby

我有一个三元运算符输出学生数。

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

我必须在put之后将字符串放在括号中,否则会出现错误:

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

但是,由于我已将代码更新为此,因此我的方法.center无效,我收到此错误:

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

如何用括号解决这个问题?

2 个答案:

答案 0 :(得分:1)

问题是您将#center的来电应用于puts的{​​{1}}

的结果
nil

注意:如果学生人数为0,那么您的留言为“现在我们有0名学生”

如果你想重构,那么你可以提取公共部分:居中和输出

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

但这会导致长行(取决于消息),因此您可以使用

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

恕我直言代码需要具有可读性,并不总是与短代码相同。特别是当有很多陈述塞进一行时。

答案 1 :(得分: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))