2013-02-26 70 views
0

我正在構建一個應用程序,它以stdin保存用戶及其偏好。我應該將stdin寫入文本文件並保存用戶輸入嗎?保存和更新用戶/偏好的Ruby命令行程序

commandline.rb

class CommandLine 
    def initialize(filename) 
     @file = File.open(filename, 'w') 
    end 

    def add_user(input) 
     @file = File.open('new_accounts.txt', 'r+') 
     @file.write(input) 
     puts input 
    end 

    def run 
     puts "Welcome to the Command Line Client!" 
     command = '' 
     while command != 'quit' 
     printf "enter command: " 
     input = gets.chomp 
     parts = input.split 
     command = parts[0] 
     case command 
      when 'quit' then puts 'Goodbye!' 
      when '-a' then add_user(parts[1..-1].join(" ")) 
      else 
      puts 'Invalid command #{command}, please try again.' 
      end 
     end 
    end 
end 

a = CommandLine.new('new_accounts.txt') 
a.run 

比方說,我希望用戶輸入 '-a湯米挺喜歡吃蘋果' 在命令行,我希望它輸出:

tommy likes apples 

同一個用戶tommy也可以輸入'-a tommy喜歡橙子',然後更新他以前的首選項:

tommy likes oranges 

任何幫助/方向表示讚賞,謝謝!

+0

您是否在尋找閱讀文件的例子? – nattyddubbs 2013-02-26 02:35:21

+0

您可以將信息保存到文本文件,但是,數據如何存儲纔是重要的。不要將其保存爲CSV或每個用戶一行。相反,使用Ruby的YAML或JSON類以更通用的格式寫入數據,這很容易被解析和重用。實際上,我會使用某種數據庫,這樣可以創建/讀取/更新/刪除用戶信息,而不必每次都讀完或覆蓋用戶文件。看看SQLite和[Sequel](http://sequel.rubyforge.org)作爲出發地。 – 2013-02-26 03:15:05

回答

0

如果您正在做一些簡單的事情,我不會看到使用文本文件的問題。替代品很多,沒有更多的細節恐怕我不能提出一個好的建議。

def add_user(input) 
    File.open('new_accounts.txt', 'w') {|file| 
     file.write(input) 
    } 
    puts input 
end 

僅供參考:這將使您的文本文件更新。 :-)

編輯:更改了add_user方法。

+1

爲什麼在方法內使用'@'實例變量?爲什麼不在塊中使用'File.open',這是慣用的Ruby,因此文件會自動關閉?爲什麼用'w'模式在'File.write'或'File.open'中寫入'r +'權限的文件更好?如果同一用戶的信息不止一次出現,會發生什麼? – 2013-02-26 03:11:08

+0

我只是增加了OP在代碼中的含義。我會更新。在回答之前,我應該多使用OP來驗證更多事件的好處。 – nattyddubbs 2013-02-26 03:12:24

+0

我會嘗試使用續集;該問題要求簡單,因此我認爲使用數據庫可能會對這個命令行應用程序過度。感謝輸入的人,我會一起更新問題。 – asing 2013-02-26 06:54:44