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]
私のブログで通常のハイライトが表示されているバージョン

Source: https://habr.com/ru/post/J77841/


All Articles