Rubyで簡単なコンソールTo-doマネージャーを作成します

JavaとPHPでプログラミングの経験がほとんどない前に、それが起こりました。 したがって、私は簡単にRuby言語に切り替えました。 もちろん、私はしばしば文献と素晴らしいユーティリティri (またはfxriのより便利な類似物)に目を向けなければなりませんでした。

私が好きなルビー言語を備えています。 (javaからphpに切り替えた後、これを本当に言えませんでした)



ルビー言語は、構文糖が豊富です。 ここでの単純なループはさまざまな方法で記述でき、多くの場合、これによりプログラムの可読性が向上します。 また、言語自体がプログラミング言語として位置付けられており、他のプログラミング言語の最高の瞬間を取り入れています。



タスクのリストを操作するために設計されたシンプルなコンソールユーティリティを紹介します。 それは非常に簡単です。誰かがこの記事を気に入ったら、機能を増やし続け、プログラムコードの詳細な説明を提供します。



このユーティリティを実行するには、コンソールに書き込むだけです。

$ ruby ./rtodo.rb







プログラムは3つのファイルで構成されています。

system.rb -Systemクラスの作業の実装を含むファイル

rtodo.rb-メインの実行可能ファイル

list.dat-タスクのストレージ



取扱説明書(例):

Webページの完全なスクリプトの追加 (タスクの追加)

リスト (すべてのタスクのリストを表示します-各タスクには独自の番号があります)

削除1 (タスク番号1を削除)



最初に、コメントなしでソースコードを表示します。 その後、各行の動作を詳細に書き留めます。




rtodo.rb


画像



System.rb


画像



メインファイル-rtodo.rbから調査を始めましょう





Systemクラスの実装を含むファイルをロードします

load 'system.rb'





Systemクラスはタスクの操作を担当します(追加/削除/表示)



クラスSystemのオブジェクトを作成します

system = System.new







ユーザーを歓迎します

puts "> Welcome to R-todo v0.1, type 'help' to get info"







文字列変数を初期化します。これはユーザーが入力する場所です

user_input = ""







while



構文を使用して、ユーザーが「quit」を入力するまでユーザーが入力したすべてを処理します。これは、プログラムがすぐに終了することを意味します



while user_input != "quit"





ユーザーがコンソールに入力したものを変数に入力します

user_input = gets.chomp





ユーザーが入力した文字列を配列に変換します。 各単語は、配列の個別の要素です。

formatted_user_input = user_input.split





さらに、キーワードハッシュ配列の各要素を調べます。 おそらく驚くでしょう。 この変数の説明はsystem.rbファイルにあります-今のところ、このハッシュ配列には「キーワード」=>「呼び出される関数」という形式の構造が含まれていることを知っているだけです。

system.keywords.each do |keyword,method|





ユーザーが入力した行の最初の単語が任意のキーワードと一致する場合、...

if formatted_user_input[0] == keyword





ユーザーが入力した文字列が保存される配列を初期化します。 最初の言葉なしで それが鍵であり、プログラム専用です

buffer = []





この行は配列を単語で埋めます

1.upto(formatted_user_input.index(formatted_user_input.last)) { |index| buffer.push(formatted_user_input.at(index))}





そして、区切り文字としてスペースを使用して、配列の単語を1行に連結します

string_user_input = buffer.join(" ")





以下のこの行は特別な注意を払う必要があります。

構文糖に加えて、ここには危険なevalメソッドがあります。これについては、php / ruby​​の本で詳しく読むことができます。 実際、task_listメソッドは引数を提供しないため、ユーザーがlistコマンドを入力した場合、eval関数への引数は1種類になり、ユーザーが他のコマンドを入力した場合、引数はシステムクラスの標準になります。

keyword == "list" ? eval("system.#{method}") : eval("system.#{method}(string_user_input)")

end

end

end

puts "> R-todo was aborted by user"








System.rbファイルに移動します



このファイルは、タスクのリストを直接処理する役割を担っています。



class System





オブジェクト変数

attr_reader :keywords, :buffer





コンストラクターメソッド。このメソッドは、Systemクラスのオブジェクトを作成するときに常に呼び出されます

def initialize





そして、そもそも、@ keywordsオブジェクト変数のハッシュ配列を初期化する

この配列にはキーワードとメソッド名が含まれます

簡単に言えば、ユーザーが「add」と入力すると、「task_add」メソッドが呼び出されます

@keywords = { 'add' => 'task_add', 'remove' => 'task_remove', 'list' => 'task_list'}





配列変数を作成します。 ここに、現在の(既存のタスク)すべてを配置します

@buffer = []





詳しく説明します。

バッファには、すべてのユーザータスクが格納されます。 ユーザーがタスクを削除するとすぐに、まずタスクがバッファから削除され、次にこのバッファ全体がファイルに書き込まれます。 つまり、ファイルの内容を書き換えるたびに。 このプログラムではこれは許容されますが、巨大なファイルを扱うアプリケーションでは、この方法はパフォーマンスに影響を与える可能性があります。



ファイルlist.dat



にはタスクのリストが含まれています



タスクリストを含むファイルが存在する場合

if File.exist?('list.dat')





list.datファイルを含むlist_file変数を初期化します

ファイルからデータをバッファに書き換えます

list_file = File.new('list.dat','r')

list_file.each_line do |line|

@buffer << line

end






このファイルが存在しない場合、...

else





新しいファイルを作成する

list_file = File.new("list.dat","w+")

puts "System files was created"

end






ファイルを閉じます(保存)

list_file.close

end








メソッドは引数として新しいタスクを追加します-タスクのテキスト

def task_add(task)





タスクテキストをバッファに入れる

@buffer << task





puts "> task added to list (#{task})"





task_write_to_file



は、バッファ全体をファイルに書き込むメソッドを呼び出します

task_list



は、現在のタスクのリストを表示するメソッドを呼び出します(更新済み)

end







メソッドはタスクを削除します。引数はタスク番号です

def task_remove(number)





引数が正しくない場合

if number.to_i > (@buffer.index(@buffer.last))

puts "> Please write a correct task index"






本当なら

else

puts "> Task #{number} removed"






バッファからタスクを削除します

@buffer.delete_at(number.to_i)





バッファ全体をファイルに書き込むメソッドを呼び出します

task_write_to_file

end






現在のタスクのリストを表示するメソッドを呼び出します(更新済み)

task_list

end








現在のタスクリストを表示するメソッド

def task_list

puts "********* #{@buffer.index(@buffer.last) + 1} item's *********\n"






バッファの各要素を調べます

@buffer.each do |task|

puts "\t #{@buffer.index(task)} - #{task}"

end

puts "\n********* #{@buffer.index(@buffer.last) + 1} item's *********"

end







メソッドはバッファ全体をファイルに書き込みます

def task_write_to_file





ファイルを開きます。2番目の引数として「w」を指定すると、代替引数「a」とは対照的に、ファイルは毎回再び書き込まれます

file = File.new('list.dat', 'w')





バッファの各要素を調べます

@buffer.each do |task|





現在のバッファ要素をファイルに書き込みます

file.puts task

end






ファイルを閉じます(保存)

file.close

end

end









これは非常に粗雑なプログラムであるという事実に注意を喚起したいと思います。 セキュリティの面で含む。 ユーザーが入力した内容を確認することにあまり注意を払いませんでした。 (そして、これが最も重要な部分です)この資料があなたの好みに合っているなら、私は必然的に機能を増やし続けます。



プログラムでアーカイブをダウンロード [Zip、1.2 kb]

私のブログで通常のハイライトが表示されているバージョン



All Articles