0

这似乎是一个奇怪的问题。我有这段 Ruby 代码,它接受一个输入字符串,使用scanflatten提取一个特定的值,然后希望在语句中对该值进行操作if...then,但我遇到了问题。

我的输入字符串描述了该地区“危险生物”的数量。当描述没有危险生物或两个或更多生物时,字符串总是标准的,例如:

“该地区没有危险生物”或“一个危险生物......”等等。

我正在使用它来获取表示生物数量的单词:“no”、“one”、“two”等,希望稍后将它们转换为数值 - “no” = 0、“one " = 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

这是问题所在:我有一个名为maxcreaturesequal to的变量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在正则表达式的末尾使用,我尝试.stripcrittercountvar 上使用。我希望有人看到这个并说“呃,试试这个。”

根据要求,这里是所有代码,这里有对其他可能没有意义的函数的调用......

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
4

4 回答 4

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
于 2012-10-24T12:33:09.523 回答
0

问题是这crittercount是一个数组,而不是一个字符串。因此if crittercount == "no"etc. 将永远不会true,您将永远以最后一个结尾else

解决方案是将您的代码更改为:

crittercount = strcheck.scan(/no|one|two|three|four|five|six|seven|eight|nine|ten/).first

crittercount将是一个字符串,或者nil您的其余代码将按预期工作。

于 2012-10-24T12:19:34.213 回答
0

看起来你正在做 if...end if...end if...end 而不是 if...elsif..elsif...end

因此,对于 10 以外的任何值,您将最终进入这个 else 块

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]
于 2012-10-24T12:22:40.363 回答
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}"

使用案例清理逻辑,只需使用正则表达式匹配并提取第一个匹配项

于 2012-10-24T12:36:57.853 回答