1

我在 Ruby 中使用 Hash,只需检查某个单词是否在“pairs”类中并替换它们。最初我在 python 中编码并想将其转换为我不熟悉的 ruby​​。这是我写的红宝石代码。

import sys

pairs = {'butter' => 'flies', 'cheese' => 'wheel', 'milk'=> 'expensive'}

for line in sys.stdin:
    line_words = line.split(" ")
    for word in line_words:
      if word in pairs
        line = line.gsub!(word, pairs[word])

puts line

它显示以下错误

syntax error, unexpected kIN, expecting kTHEN or ':' or '\n' or ';'
      if word in pairs
                ^

下面是正确的原始python脚本:

import sys

pairs = dict()

pairs = {'butter': 'flies', 'cheese': 'wheel', 'milk': 'expensive'}

for line in sys.stdin:
  line = line.strip()
  line_words = line.split(" ")
  for word in line_words:
    if word in pairs:
      line = line.replace(word ,pairs[word])

print line 

是因为“import sys”还是“Indentation”?

4

2 回答 2

1

尝试这个:

pairs = {'butter' => 'flies', 'cheese' => 'wheel', 'milk'=> 'expensive'}

line = ARGV.join(' ').split(' ').map do |word|
  pairs.include?(word) ? pairs[word] : word
end.join(" ")

puts line

这将遍历传递给脚本的每个项目并返回单词或替换单词,并用空格连接。

于 2013-07-17T15:38:18.910 回答
0

for通常在 Ruby 中不使用,因为它有一些不寻常的作用域。

我会这样写:

pairs = { "butter" => "flies", "cheese" => "wheel", "milk" => "expensive" }
until $stdin.eof?
  line = $stdin.gets
  pairs.each do |from, to|
    line = line.gsub(from, to)
  end

  line
end

importRuby 中不存在,所以不应该存在。您还必须end在 Ruby 中“关闭”每个块,仅缩进是不够的(缩进对 Ruby 没有任何意义,尽管您仍然应该保留它以提高可读性)。

于 2013-07-17T17:37:21.337 回答