我正在关注Micheal Hartl的Rails教程,这个问题来自第4章。
我正在尝试执行以下循环:
>> s = "foobar"
>> if s.nil?
>> "The variable is nil"
>> elsif s.empty?
>> "The string is empty"
>> elsif s.include?("foo")
>> "The string includes 'foo'"
>> end
根据书,它应该打印:
=> "The string includes 'foo'"
但我得到答案:nil
现在我也一个接一个地尝试了分支(即只要条件)然后它工作正常。
尝试了以下几个问题,但遇到了同样的问题。
> if s.nil?
> return_value = "The variable is nil"
> elsif s.empty?
> return_value = "The string is empty?"
> elseif s.include?("foo")
> return_value = "The string has 'foo'"
> end
=> nil
此时我一直在使用“elseif”而不是“elsif”
答案 0 :(得分:2)
更新(无视下面的评论讨论):
if-else循环(或任何循环)将在控制台中返回nil。所有循环都是为您设置变量但实际上并不返回它们 因此,为了返回它们,我们需要将循环包装在如下的方法中:
[8] pry(main)> def my_loop
[8] pry(main)* return_value = nil
[8] pry(main)* s = "foobar"
[8] pry(main)* if s.nil?
[8] pry(main)* return_value = "The variable is nil"
[8] pry(main)* elsif s.empty?
[8] pry(main)* return_value = "The string is empty?"
[8] pry(main)* elsif s.include?("foo")
[8] pry(main)* return_value = "The string includes 'foo'"
[8] pry(main)* end
[8] pry(main)* return_value
[8] pry(main)* end
=> :my_loop
[9] pry(main)> my_loop
=> "The string includes 'foo'"
[10] pry(main)>
答案 1 :(得分:0)
在任何条件下,您实际上都没有返回任何内容。您需要有puts
语句,这将打印字符串。
你的方式:
[3] pry(main)> if s.nil?
[3] pry(main)* "blah"
[3] pry(main)* elsif s.empty?
[3] pry(main)* "tree"
[3] pry(main)* elsif s.include?("tree")
[3] pry(main)* "ha"
[3] pry(main)* end
=> nil
我的方式:
[1] pry(main)> s = "foobar"
=> "foobar"
[2] pry(main)> if s.nil?
[2] pry(main)* puts "blah"
[2] pry(main)* elsif s.empty?
[2] pry(main)* puts "blah"
[2] pry(main)* elsif s.include?("foo")
[2] pry(main)* puts "tree"
[2] pry(main)* end
tree
=> nil
答案 2 :(得分:0)
我找到了这个案例的答案:
elseif 不是正确的分支命令。所以你使用的代码实际上解释为:
if s.nil?
return_value = "The variable is nil"
elsif s.empty?
return_value = "The string is empty?"
elseif s.include?("foo")
return_value = "The string has 'foo'"
end
为什么返回nil?因为代码实际上属于else
块,如您所见:not nil and not empty
为什么elseif不会返回错误?由于Ruby使用延迟评估。 s.empty?
返回false,因此它甚至不会尝试在elsif
中执行该块。然后它无法知道elseif函数是否已预定义。
这可以理解吗?
所以解决方案非常简单,正确 elseif 到 elsif 。玩得开心!