Ruby 编解码程序

Ruby 编解码程序,ruby,Ruby,我正在使用ruby编写一个简单的编解码程序。编码器工作正常,但是,我无法正确解码文件。它总是返回一个空白的文本文件,而不是经过良好解码的文本文件。 代码如下: 编码器,工作正常: # Get evil idea and encode print "Enter your diabolical scheme: " $idea = gets $encode1 = $idea.reverse $encode2 = $encode1.capitalize print $encode2 print" "

我正在使用ruby编写一个简单的编解码程序。编码器工作正常,但是,我无法正确解码文件。它总是返回一个空白的文本文件,而不是经过良好解码的文本文件。 代码如下:

编码器,工作正常:

# Get evil idea and encode
print "Enter your diabolical scheme: " 
$idea = gets
$encode1 = $idea.reverse
$encode2 = $encode1.capitalize

print $encode2
print"
"

#Save the jibberish to a new file
print "
File encoded.  Please enter a name for this idea: " 
idea_name = gets.strip
File::open( "idea-" + idea_name + ".txt", "w" ) do |f|
  f << $encode2
end
#获取邪恶想法并编码
打印“输入你的恶魔计划:”
$idea=get
$encode1=$idea.reverse
$encode2=$encode1.1大写
打印$encode2
“打印”
"
#将jibberish保存到新文件
“打印”
文件已编码。请输入此想法的名称:
idea\u name=get.strip
文件::open(“idea-”+idea_name+”.txt、“w”)do | f|

f只是给你一个例子,让你看看理想化的ruby是什么样子的:

# encoder.rb
puts "Enter your diabolical scheme: "

encoded = gets.chomp.reverse.capitalize

puts encoded

puts "File encoded."
puts "Please enter a name for this idea: "
name = gets.chomp

File.open("idea-#{name}.txt", "w" ) do |file|
  file << encoded
end

我看到的一个可能的问题是,如果
$file
包含一个通配符(
*
),则此代码每次通过循环时都会在
$idea
上跺脚,导致只有最后读取的文件在
$idea
中:

Dir[$file].each do |file_name|
  $idea = read.File($file)
end
相反,您可能希望使用
Dir
循环包装所有内容,以便依次处理每个文件

不要使用
$globals
,除非你知道为什么需要它们。随意使用它们表明您不了解变量作用域,并且正在使用它们来解决代码中的错误

我将重新编写代码,使其看起来更像:

# Get evil idea and encode
print 'Enter your diabolical scheme: ' 

encode2 = gets.strip.reverse.capitalize
puts encode2

# Save the jibberish to a new file
print ['', 'File encoded. Please enter a name for this idea: '].join("\n")
idea_name = gets.strip
idea_name += '.txt' unless idea_name[/\.txt$/i]
File.open( "idea-#{ idea_name }", 'w' ) { |fo| fo.puts encode2 }
以及:

我可以使用
File.read
File.write
,但它们都使用“二进制”模式,这不会转换行结束。因此,在读取文本文件时最好使用“文本”模式,因为这样Ruby就可以为正在使用的操作系统做正确的事情
File.read
返回块返回的值,以便我可以将其分配给变量


我建议不要盲目地将
'.txt'
分配给文件名。相反,看看是否需要分配它。有时,在打字的热度中,我们忘记了我们不需要输入它,然后你会试图读取或写入扩展名为“.txt.txt”的文件。

只是好奇,为什么你要在所有变量前加$?我以前从未见过Ruby代码可以做到这一点。$variable是全局变量,而不是@instance变量或@class变量,对吗?我就是这样被教导的。啊,你说得对。今天学到了一些新东西。我想至少有一个问题是,在
获取
后,您没有删除换行符。试试
$name=gets.chomp
。您可能也不想使用全局变量(
$
);在这个例子中没有理由这样做,一般来说,除非在特殊情况下(但这不是它被破坏的原因),否则应该避免这样做。您可以简单地删除
$
并使用裸字作为变量名(您也不需要它们作为实例变量)。是的,
$var
是一个全局变量,但教您这样做的人都是错误的。我们应该只在必要时使用globals,而不是为了解决范围界定问题或“因为”<代码>$var
在程序中包含的任何文件中都可见,如果它们与其他地方添加的全局代码冲突,则可能会导致问题。因为您使用的是
读取行
,因此代码将只返回
编码的
中读取的第一行。这只是一个例子。
Dir[$file].each do |file_name|
  $idea = read.File($file)
end
# Get evil idea and encode
print 'Enter your diabolical scheme: ' 

encode2 = gets.strip.reverse.capitalize
puts encode2

# Save the jibberish to a new file
print ['', 'File encoded. Please enter a name for this idea: '].join("\n")
idea_name = gets.strip
idea_name += '.txt' unless idea_name[/\.txt$/i]
File.open( "idea-#{ idea_name }", 'w' ) { |fo| fo.puts encode2 }
print 'Name of file to decode: '
name = gets.strip
name += '.txt' unless name[/\.txt$/i]

Dir[name].each do |fn|

  idea = File.open(fn, 'r') { |fi| fi.read }

  # Print each idea out with the words fixed
  decode3 = idea.reverse().capitalize()
  puts decode3

  # Save decoded file to new location
  print ['', 'File decoded.  Please enter a new name for this idea: '].join("\n")
  idea_name = gets.strip
  idea_name += '.txt' unless idea_name[/\.txt$/i]
  File::open(idea_name, 'w') { |fo| fo.puts decode3 }

end