Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 无法解析Rails控制台中的if-else循环(Rails教程-第4章)_Ruby On Rails_Ruby_Railstutorial.org - Fatal编程技术网

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

Ruby on rails 无法解析Rails控制台中的if-else循环(Rails教程-第4章),ruby-on-rails,ruby,railstutorial.org,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

我正在学习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”

(忽略下面的评论讨论):

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)>  

在任何情况下,您实际上都不会返回任何内容。您需要有一个
put
语句,它将打印字符串

你的方式:

[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

我找到了这个案例的答案:

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
块,如您所见:
非nil且非空

为什么elseif不返回错误?因为Ruby使用惰性计算。
s.empty?
返回false,因此它甚至不尝试在
elsif
中执行块。然后它无法知道elseif函数是否预定义

这可以理解吗


所以解决方案非常简单,正确的elseif到elsif。玩得开心

这实际上应该是可行的,只需在这里添加
put
@7urkm3n
put
没有任何区别。我也遇到了同样的问题。这在我的控制台中运行。请确保您按照7urkm3n所说的添加“puts”…您应该在运行此操作时看到打印的行,但是它仍然会返回nil,因为puts方法始终返回nil。是的,我正在执行与所述相同的操作@7urkm3n@Nirupa你用的是什么版本的ruby?那为什么它在我的系统中不起作用呢安慰我还尝试了不同的字符串,所有字符串都返回nilYes,正如在我的控制台中看到的,返回值为“=>nil”,但行“put return_value”输出正确的字符串。你试过了吗?如果你愿意,你可以像我一样发布你的控制台示例。是的,我试过了。但正如你所说,它应该先打印正确的行。但它并没有,它将返回nil,因为实际上使用if-elsif循环并没有返回任何内容。if-else循环所做的就是设置return\u value变量的值。这是正确的。如果要使用它(循环的输出),可以在定义If-else循环后在控制台中键入return_值。你会看到返回值是正确的。我的答案仍然是零。我认为puts是另一种打印方法,因为即使使用上述代码,if else循环也会打印正确的答案。是的,这正是我做错的地方。非常感谢。