Ruby 编解码程序
我正在使用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" "
# 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