在Rails控制台中无法解析if-else循环(Rails教程 - 第4章)

时间:2016-04-26 00:53:35

标签: ruby-on-rails ruby railstutorial.org

我正在关注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”

3 个答案:

答案 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 。玩得开心!