2016-04-22 76 views
1

我是Ruby新手。 我需要让这个脚本工作:如何使脚本在Ruby中工作?

puts "Do you like cats?" 
ask = gets 

def ask(n) 

if ask == yes 
    return "I do too" 
end 

if ask == no 
    return "Dogs are better" 
end 
end 

puts "#{ask(n)}" 

错误消息:

pracif.rb:15:在<main>': undefined local variable or method N”为 主:对象(NameError)

+0

引用'no'和'yes',它的n ==“是”n ==“no”不问== == –

+0

请阅读“[问]”,包括底部链接的页面和“[mcve ]”。 –

回答

3

这里有一个脚本,该脚本会为你工作:

puts "Do you like cats?" 
answer = gets 

def ask(n) 

if n == 'yes' 
    return "I do too" 
end 

if n == 'no' 
    return "Dogs are better" 
end 
end 

puts ask(answer.downcase.chomp) 

  1. 由于错误说你想在一个变量n这是不通过定义为

  2. 其次你有一个方法名称ask相同的变量名称。我已经改名为变量来代替answer

  3. 第三,用引号括起来

  4. 最后yesno,因为你正在使用gets一个\n获得附加像yes\n所以没有你的条件将匹配。所以我用chomp删除\n。并且还使用downcase使输入大小写不敏感。

编辑

正如意见中提到的@Jordan,没有理由使用字符串插值卖出期权声明。所以直接调用该方法就足够了。

+0

是的,现在它工作!非常感谢。我会接受它作为答案。 – user3043926

+0

“puts”#{foo}“'没有任何理由。 '#{...}'用于字符串插值 - 即。将值插入到具有其他内容的字符串中,例如'“Hello,#{name}” - 但是在“#{ask(...)}”中没有其他内容,因此您只是做相当于'放问(...)。to_s'。但在这种情况下,'ask'总是返回一个字符串,所以不需要'to_s'。此外,'puts'自动调用'to_s'参数,所以'to_s'在这里也是不必要的。只要“放问(...)'。 –

+0

@Jordan谢谢,我错过了。我已经更新了答案。 – Alfie

1

您的脚本没有定义局部变量n,您最终将传递给您的ask(n)方法。

重命名ask变量脚本gets从用户到answer例如,并将它传递给你的ask方法在最后像这样:

更新代码来解决其他问题,我并没有在第一次运行看。

puts "Do you like cats?" 
answer = gets.chomp 

def ask(n) 
    (n == 'yes') ? "I do too" : "Dogs are better" 
end 

puts "#{ask(answer)}" 
+0

它仍然显示错误。但谢谢你的帮助。 – user3043926

+0

这不起作用。这个回应有很多问题。 – jbeck

+0

可能希望在引号中包含“yes”和“no”值 – Alfie

1

你的代码有一堆问题。尝试更类似于:

def reply(response) 
return 'I do too' if response == 'yes' 
return 'Dogs are better' if response == 'no' 
'Invalid response!' 
end 

puts 'Do you like cats?' 
response = gets().chomp() 
puts reply(response) 

注意变量名称。如果你保持它们的描述性,就很容易发现错误。

+0

好吧,我喜欢它。但如果输入yes或no,则显示'无效回复'。 。 。 – user3043926

+0

啊。好决定。 'chomp()'调用应该可以解决这个问题。 'gets()'从用户输入中捕获换行符。 – jbeck