Ruby 未定义的方法';中心';对于nilclass

Ruby 未定义的方法';中心';对于nilclass,ruby,Ruby,我有一个三元运算符,它输出学生计数 @students.count < 2 ? puts("Now we have #{@students.count} student").center(75) : puts("Now we have #{@students.count} students").center(75) 但是,由于我已将代码更新到此版本,因此我的方法.center不起作用,我收到此错误: `input_students': undefined method `center'

我有一个三元运算符,它输出学生计数

@students.count < 2 ? puts("Now we have #{@students.count} student").center(75) : puts("Now we have #{@students.count} students").center(75)
但是,由于我已将代码更新到此版本,因此我的方法
.center
不起作用,我收到此错误:

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

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

Kernel.puts方法总是返回nil

您可能希望这样做:

puts((@students.count < 2 ? "Now we have #{@students.count} student" : "Now we have #{@students.count} students").center(75))
put(@students.count<2?“现在我们有{@students.count}学生”:“现在我们有{@students.count}学生”).center(75))
就我个人而言,我会这样写:

message= "Now we have #{@students.count} student"
message << 's' if @students.count > 1
puts(message.center(75))
message=“现在我们有了#{@students.count}student”
信息1
放置(消息中心(75))

问题在于,您正在将对
#center
的调用应用于碰巧为
nil的
put
的结果

@students.count < 2 ? puts("Now we have #{@students.count} student".center(75)) : puts("Now we have #{@students.count} students".center(75))
@students.count<2?puts(“现在我们有{@students.count}student.center(75)):puts(“现在我们有{@students.count}students.center(75))
注意:如果学生人数为0,则您的消息显示“现在我们有0名学生”

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

message = count < 2 ? 'message 1' : 'message 2'
puts message.center(75)
message=count<2?“消息1':“消息2”
放置消息。中心(75)
但这仍然会导致一条长线(取决于消息),因此您可以使用

message = if count < 2
            'message 1'
          else
            'message 2'
          end
puts message.center(75)
message=如果计数<2
“消息1”
其他的
“信息2”
结束
放置消息。中心(75)

IMHO代码需要可读,这并不总是与短代码相同。尤其是当一行中塞满了大量语句时。

这里不要使用三元,如果使用
,请使用
。另外,您正在将
中心
应用于
放置
的结果。将它应用于字符串。我以前有一个if语句,但我想重构。你认为它现在读起来更好吗?“简洁的一行程序”并不等同于“可读的代码”。你喜欢的代码虽然比原来的代码更紧凑、更枯燥,但仍然是维护的噩梦:)例如:如果模板更改为,比如说,
“现在我们有了#{@students.count”这门课的学生“
?示例:如果你需要支持另一种语言,使用完全不同的复数化规则怎么办?需要思考的是:)如果这是需要维护的,我会使用复数化器;)
message = if count < 2
            'message 1'
          else
            'message 2'
          end
puts message.center(75)