这似乎是一个奇怪的问题。我有一些带有输入字符串的Ruby代码,使用scan
和flatten
来提取特定值,然后希望在if...then
中操作该值声明,但我遇到了问题。
我的输入字符串描述了该区域中“危险生物”的数量。当描述没有危险的生物或两个或更多生物时,该弦总是标准的,如:
“该地区没有危险的生物”或“一个危险的生物......”等等。
我正在使用它来获取表示生物数量的单词:“no”,“one”,“two”等等,希望稍后将这些转换为数值 - “no”= 0 ,“一”= 1,等等。
为此,我使用:
crittercount = strcheck.scan(/a*(no|one|two|three|four|five|six|seven|eight|nine|ten)a*/)
然后我去变量if then
做一个crittercount
说:
if crittercount == "no"
critters = 0
... exit and go do something with the var...
end
我为每个人这样做。 (当我发现这个问题时,我将使用if..elsif..end
)
if crittercount == "one"
critters = 1
... exit and go do something with the var...
end
...
crittercount == "ten"
之后我只使用
if crittercount == "ten"
critters = 10
else
critters = 99
end
问题在于:我有一个名为maxcreatures
的变量等于10
。我采用strcheck
值“该地区没有危险的生物”,例如,我打印出它返回的确切字符串的值。然后我打印出crittercount变量,在这个例子中,我得到“不”。
当我通过我的if..then..
语句时,我会评估使用方法:
if critters > maxcreatures
print "Maximum Creatures " + critters.to_s + " and maximum is #{maxcreatures}. Lets Bail"
else
print "Critter count " + critters.to_s + " is less than #{maxcritters} Keep going."
end
在每种情况下我都会99
,我发誓我已经尝试了一切。我尝试在正则表达式的末尾使用.flatten
,我尝试在.strip
var上使用crittercount
。我希望有人看着这个,然后去试试吧。“
根据要求这里是所有代码,这里有调用其他功能可能没有意义...
maxcritters = 2
critters = 0
put "count critter"
strcheck = matchfind "You notice ?"
crittercount = strcheck.scan(/a*(no|one|two|three|four|five|six|seven|eight|nine|ten)a*/)
echo strcheck
echo crittercount
crittercount = crittercount.strip
if crittercount == "no"
critters = 0
goto "roundup"
end
if crittercount == "one"
critters = 1
goto "roundup"
end
if crittercount == "two"
critters = 2
goto "roundup"
end
if crittercount == "three"
critters = 3
goto "roundup"
end
if crittercount == "four"
critters = 4
goto "roundup"
end
if crittercount == "five"
critters = 5
goto "roundup"
end
if crittercount == "six"
critters = 6
goto "roundup"
end
if crittercount == "seven"
critters = 7
else
critters = 99
end
roundup:
if critters > maxcritters
echo "Maximum Creatures " + critters.to_s + " and maximum is #{maxcritters}. Lets Bail"
critters == nil
fput "retreat"
else
echo "Critter count " + critters.to_s + " is below maximum of #{maxcritters} - We're cool. Keep going."
critters == nil
goto "combatcheck"
end
答案 0 :(得分:1)
scan
非常有用。由于您只希望每个字符串匹配一次,所以不应该使用它。
以下内容将直接为您提供critters
。你不需要所有这些条件。
regex = /(\bno\b)|(\bone\b)|(\btwo\b)|(\bthree\b)|(\bfour\b)|(\bfive\b)
|(\bsix\b)|(\bseven\b)|(\beight\b)|(\bnine\b)|(\bten\b)/x
critters = strcheck.match(regex).to_a.drop(1).index{|x| x} || 99
答案 1 :(得分:0)
问题是crittercount
是一个数组,而不是一个字符串。因此,if crittercount == "no"
等永远不会true
,您将始终在最后else
内结束。
解决方案是将您的代码更改为:
crittercount = strcheck.scan(/no|one|two|three|four|five|six|seven|eight|nine|ten/).first
这个crittercount
将是一个字符串或nil
,其余代码将按预期工作。
答案 2 :(得分:0)
看起来你正在做...如果...结束如果......结束而不是......如果... elsif..elsif ...结束
因此,对于10以外的任何值,您将最终进入其他块
if crittercount == "ten"
critters = 10
else
critters = 99
end
案例陈述在这里会更好......
case (crittercount)
when "no" then critters = 0
when "one" then critters = 1
when "two" then critters = 2
when "three" then critters = 3
when "four" then critters = 4
when "five" then critters = 5
when "six" then critters = 6
when "seven" then critters = 7
when "eight" then critters = 8
when "nine" then critters = 9
when "ten" then critters = 10
else critters = 99
end
或者更好的是,如果查找失败,则对所有默认为99的数字进行哈希查找。
numberHash = { "no" => 0, "one" => 1, "two" => 2, "three" => 3, "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8, "nine" => 9, "ten" => 10 }
numberHash.default = 99
critters = numberHash[critterCount]
答案 3 :(得分:0)
scan返回一个数组,包含匹配数据和数组,所以在你的代码中,如果你调用.first.first,你会得到第一个匹配。你也可以这样做
strcheck = "two dangerous creatures in the area" # or "one dangerous creature...'
strcheck =~ (/(.*) dangerous.*/)
critters = case $1
when 'no' then 0
when 'one' then 1
when 'two' then 2
when 'three' then 3
when 'four' then 4
when 'five' then 5
when 'six' then 6
when 'seven' then 7
else 99
end
puts "number of critters #{critters}"
使用案例清理逻辑,只需使用正则表达式匹配并提取第一个匹配