牛がぴかぴか光るルビー反復器
D瓜哥は最近ウェブサイトを作りたいと思っています.また、古くから動的言語を勉強する考えがあり、2つの条件を満たすプログラミング言語の中で、Ruby、Pythonが最も適切な2つの言語です.今Ruby on Railsは日中天のように、光り輝いています!だから、ルビーを選んで、ゼロから勉強します.
一昨日Rubyの反復器を見て、Java、C/C++などしか習ったことがない私にとって、絶対に目の前が明るくなった感じです!しかも光り輝いています:反復器がこのように遊ぶことができるとは思わなかった.簡潔すぎて便利で、とても強いです.そして、D瓜兄は待ちきれずにルビーの反復器を紹介する文章を書きたいと思っています.
反復器の概要
まず反復器を簡単に紹介します.
1.Ruby反復器はコードブロックを簡単に受信できる方法である(例えばeachという方法は反復器である).特徴:一つの方法にyield呼び出しが含まれている場合、この方法は反復器に違いない.
2.反復メソッドとブロックの間には、ブロックが特殊なパラメータとして反復メソッドに渡され、反復メソッドの内部でyieldを使用してコードブロックを呼び出すときにパラメータ値をブロックに渡すことができる伝達関係がある.
3.実際、反復器の機能はコールバックです!反復器メソッドが属するクラスは、遍歴が必要な要素を遍歴するだけで、要素に対する処理はコールバックコードブロックによって実現されます.
4.Rubyのコンテナオブジェクト(配列、Range、Hashオブジェクトなど)には、eachとcollectの2つの簡単な反復器が含まれています.eachは、集合の各要素に対してブロックを呼び出す最も簡単な反復器と考えられます.collectは、コンテナの要素を1つのブロックに渡し、ブロックで処理した後、処理結果を含む新しい配列を返します.
反復器の詳細
Rubyの反復器はいろいろありますが、文字列、数字、配列、Map、ファイル、ディレクトリなどいくつかの面からRubyの反復器を簡単に紹介します.
文字列反復
Javaでは、文字列タイプのデータには反復器がありません.したがって、「遍歴」文字列が必要な場合は、文字列を他の処理を行う必要があります.でも、ルビーの中にあります.次に、コードを使用して説明します.
コードは次のとおりです.
each_byteは、各バイトを処理するための文字列の反復器です.各バイトはブロックパラメータcに代入される.
Rubyには,バイト用の反復器だけでなく,各行用の反復器もある.例は次のとおりです.
コードは次のとおりです.
どうですか、ルビーの簡潔で強い反復器に屈服したのではないでしょうか.いい芝居はまだ後ろにあるので,下を向いている.
ディジタル反復器
ルビーでは「すべてが対象」であり、数字も対象である.これはJavaとは違います.だから、字の反復器は、私というJavaプログラム猿にも聞いたことがありません.2つの例を書いてみましょう.
最初のシーン:あるセグメントのコードに対してN(例えば5)回の操作を行います.Javaではループを書く必要がありますが、Rubyではtimesメソッドを呼び出すだけでいいです.コードは以下の通りです.
コードは次のとおりです.
2番目のシーン:1から5の数字の和を求めます.これもとても簡単です.
コードは次のとおりです.
upto関数を使用する場合は、次のように書くこともできます.
コードは次のとおりです.
時々、私たちのステップは必ずしも1ではなく、2かもしれません.例えば、奇数の和です.この場合step関数を使用できます.コードは次のとおりです.
ちょっと話が遠くなったような気がします.次に、配列に関連する反復器について説明します.
アレイ反復器
数値関連の反復器を見たので,配列関連の反復器を見てみましょう.
最初のシーン:配列を便利にし、各要素を出力します.直接コード:
コードは次のとおりです.
配列の要素を選択する必要がある場合があります.
コードは次のとおりです.
配列の一部の値を削除する必要がある場合があります.この場合:
コードは次のとおりです.
もう1つの例を示します.
コードは次のとおりです.
Map反復器
Javaでは、Mapに対して反復器を使用する場合は、MapをListタイプのコンテナに変換する必要があります.しかし、Rubyには、Mapに直接対応した反復器があり、便利です.
コードは次のとおりです.
さらに、私たちはこのようにすることができます.
コードは次のとおりです.
ここで説明すると、上記プログラムはpair[1]を使用してMapの値を読み出し、Mapのキーを読み出す場合はpair[0]と書く.
MapのKeyを出力する必要がある場合は、次のようにします.
コードは次のとおりです.
Mapのvalueを出力する必要がある場合は、次のようにします.
コードは次のとおりです.
ファイル反復
ファイルに対してRubyにも反復器があるとは思いもよらなかった.次のようになります.
コードは次のとおりです.
実際には、コードブロックを使用して同じ操作を行うことができます.
コードは次のとおりです.
コードブロックを使用して、手動closeは必要ありません.これオススメ!
ディレクトリ反復
多くの場合、ディレクトリの下にあるファイルのリストをリストし、各ファイルを操作するように設定する必要があります.この場合も反復器が必要です.ルビーも考えました
コードは次のとおりです.
の最後の部分
以上の紹介から分かるように、JavaはRubyに比べて、反復器の面ではまるで弱爆です!もちろん、D瓜兄はRubyを勉強し始めたばかりで、文の中には間違ったことを説明したり、苦労したりして、D瓜兄はできるだけ早く修正すると指摘しています.
この文書は次のとおりです.http://www.jb51.net/article/54622.htm
一昨日Rubyの反復器を見て、Java、C/C++などしか習ったことがない私にとって、絶対に目の前が明るくなった感じです!しかも光り輝いています:反復器がこのように遊ぶことができるとは思わなかった.簡潔すぎて便利で、とても強いです.そして、D瓜兄は待ちきれずにルビーの反復器を紹介する文章を書きたいと思っています.
反復器の概要
まず反復器を簡単に紹介します.
1.Ruby反復器はコードブロックを簡単に受信できる方法である(例えばeachという方法は反復器である).特徴:一つの方法にyield呼び出しが含まれている場合、この方法は反復器に違いない.
2.反復メソッドとブロックの間には、ブロックが特殊なパラメータとして反復メソッドに渡され、反復メソッドの内部でyieldを使用してコードブロックを呼び出すときにパラメータ値をブロックに渡すことができる伝達関係がある.
3.実際、反復器の機能はコールバックです!反復器メソッドが属するクラスは、遍歴が必要な要素を遍歴するだけで、要素に対する処理はコールバックコードブロックによって実現されます.
4.Rubyのコンテナオブジェクト(配列、Range、Hashオブジェクトなど)には、eachとcollectの2つの簡単な反復器が含まれています.eachは、集合の各要素に対してブロックを呼び出す最も簡単な反復器と考えられます.collectは、コンテナの要素を1つのブロックに渡し、ブロックで処理した後、処理結果を含む新しい配列を返します.
反復器の詳細
Rubyの反復器はいろいろありますが、文字列、数字、配列、Map、ファイル、ディレクトリなどいくつかの面からRubyの反復器を簡単に紹介します.
文字列反復
Javaでは、文字列タイプのデータには反復器がありません.したがって、「遍歴」文字列が必要な場合は、文字列を他の処理を行う必要があります.でも、ルビーの中にあります.次に、コードを使用して説明します.
コードは次のとおりです.
str = "abc"
str.each_byte {|c| printf ">%c", c}; #
# :( ,D #。)
# , 。
#>a>b>c
each_byteは、各バイトを処理するための文字列の反復器です.各バイトはブロックパラメータcに代入される.
Rubyには,バイト用の反復器だけでなく,各行用の反復器もある.例は次のとおりです.
コードは次のとおりです.
str = "abc
efg
hijk"
str.each_line{|l| print l}
# :
#abc
#efg
#hijk
どうですか、ルビーの簡潔で強い反復器に屈服したのではないでしょうか.いい芝居はまだ後ろにあるので,下を向いている.
ディジタル反復器
ルビーでは「すべてが対象」であり、数字も対象である.これはJavaとは違います.だから、字の反復器は、私というJavaプログラム猿にも聞いたことがありません.2つの例を書いてみましょう.
最初のシーン:あるセグメントのコードに対してN(例えば5)回の操作を行います.Javaではループを書く必要がありますが、Rubyではtimesメソッドを呼び出すだけでいいです.コードは以下の通りです.
コードは次のとおりです.
5.times {print "I love http://www.jb51.net/
"} #
# :
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
#I love http://www.jb51.net/
2番目のシーン:1から5の数字の和を求めます.これもとても簡単です.
コードは次のとおりです.
sum = 0
(1..5).each {|i| sum += i}
print "Sum="+sum.to_s
upto関数を使用する場合は、次のように書くこともできます.
コードは次のとおりです.
sum = 0
1.upto(5) {|x| sum += x }
print "Sum="+sum.to_s
時々、私たちのステップは必ずしも1ではなく、2かもしれません.例えば、奇数の和です.この場合step関数を使用できます.コードは次のとおりです.
sum = 0
1.step(5, 2) do |y| # step 。
sum += y
end
print "Sum="+sum.to_s
ちょっと話が遠くなったような気がします.次に、配列に関連する反復器について説明します.
アレイ反復器
数値関連の反復器を見たので,配列関連の反復器を見てみましょう.
最初のシーン:配列を便利にし、各要素を出力します.直接コード:
コードは次のとおりです.
languages = ['Ruby', 'Javascript', 'Java']
languages.each_with_index do |lang, i|
puts "#{i}, I love #{lang}!"
end
# :
#0, I love Ruby!
#1, I love Javascript!
#2, I love Java!
配列の要素を選択する必要がある場合があります.
コードは次のとおりです.
#
b = [1,2,3].find_all{ |x| x % 2 == 1 }
# b [1,3]
配列の一部の値を削除する必要がある場合があります.この場合:
コードは次のとおりです.
#
a = [51, 101, 256]
a.delete_if {|x| x >= 100 }
# a [51]
もう1つの例を示します.
コードは次のとおりです.
# find the longest word
longest = ["cat", "sheep", "bear"].inject do |memo,word|
( memo.length > word.length )? memo : word
end
puts longest
# :
#sheep
Map反復器
Javaでは、Mapに対して反復器を使用する場合は、MapをListタイプのコンテナに変換する必要があります.しかし、Rubyには、Mapに直接対応した反復器があり、便利です.
コードは次のとおりです.
sum = 0
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each{|item, price|
sum += price
}
print "Sum="+sum.to_s
さらに、私たちはこのようにすることができます.
コードは次のとおりです.
sum = 0
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each{|pair|
sum += pair[1] #
}
print "Sum="+sum.to_s
ここで説明すると、上記プログラムはpair[1]を使用してMapの値を読み出し、Mapのキーを読み出す場合はpair[0]と書く.
MapのKeyを出力する必要がある場合は、次のようにします.
コードは次のとおりです.
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each_key do |k|
puts k
end
Mapのvalueを出力する必要がある場合は、次のようにします.
コードは次のとおりです.
outcome = {"book1"=>1000, "book2"=>1000,"book3"=>4000}
outcome.each_value do |v|
puts v
end
ファイル反復
ファイルに対してRubyにも反復器があるとは思いもよらなかった.次のようになります.
コードは次のとおりです.
f = File.open("sample.txt")
f.each{|line|
print line
}
f.close
実際には、コードブロックを使用して同じ操作を行うことができます.
コードは次のとおりです.
File.open("str.rb", "r") do |file|
file.each{|line|
print line
}
end
コードブロックを使用して、手動closeは必要ありません.これオススメ!
ディレクトリ反復
多くの場合、ディレクトリの下にあるファイルのリストをリストし、各ファイルを操作するように設定する必要があります.この場合も反復器が必要です.ルビーも考えました
コードは次のとおりです.
Dir.foreach("c://") do |file| # ,
puts file
end
# , 。
の最後の部分
以上の紹介から分かるように、JavaはRubyに比べて、反復器の面ではまるで弱爆です!もちろん、D瓜兄はRubyを勉強し始めたばかりで、文の中には間違ったことを説明したり、苦労したりして、D瓜兄はできるだけ早く修正すると指摘しています.
この文書は次のとおりです.http://www.jb51.net/article/54622.htm