2013-07-17 4 views
1

Я использую Hash в Ruby, просто проверьте, находится ли определенное слово в классе «пар» и замените их. Сначала я код в python и хочу преобразовать его в ruby, с которым я не знаком. Вот код ruby, который я написал.Хэш в Ruby & Convert python to 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 
       ^

Хотя ниже оригинальный питон скрипт, который является правильным:

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 

Является ли это из-за "импортными SYS" или «Отступ»?

ответ

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 

Это будет охватывать каждый элемент, переданный скрипту, и возвращает слово или заменяющее слово, соединенное пробелом.

+0

Thanks kardeiz! Каков тип строки, которую Ruby «puts», это массив? Поскольку он печатает одно слово по строкам, мне интересно, разделили ли строки дважды. Если я все еще хочу выделить целую строку, что мне делать? line.join ("") не может решить проблему. – user2592038

+0

Привет! Я нашел разницу, когда я помещал кавычки во входные данные. Например, когда я пытаюсь ввести «это масло», он печатает «это масло». Если это «это масло», выход будет «это мухи». В чем причина разницы? И когда я помещаю код на сервер, появляется ошибка под названием «неопределенный метод« map »для« this is butter »: String (NoMethodError)». – user2592038

+0

Я немного изменил сценарий, чтобы вы могли передать строку, которая должна быть преобразована либо в виде последовательности аргументов, либо как одна (завернутая в кавычки): 'ARGV.join ('') .split ('')', которая объединяет arg массивом с пробелом, затем разбивается на пробелы. Я не уверен в вашей второй проблеме: каков контекст, в котором вызывается сценарий? Ваша ошибка указывает, что 'ARGV' интерпретируется как строка, но' ARGV' всегда должен быть массивом (даже если пустым). –

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 

import не существует в Ruby, так что не должно быть там. Вы также должны «закрыть» каждый блок с помощью end в Ruby, одного отступания недостаточно (отступы не означают ничего для Ruby, хотя вы все равно должны сохранять его для удобочитаемости).