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)