2016-09-12 14 views
1

私はパスワードをブルートフォースしようとしています。私はいくつかのループを演奏していたので、特定の順序があることに気付きました。私はfor i in '.'..'~'を持っている場合と同様に、それはこれを見た後Rubyループの順序?

. 
/
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
: 
; 
< 
= 
> 
? 
@ 
A 
B 
C 
D 
E 
F 
G 
H 
I 
J 
K 
L 
M 
N 
O 
P 
Q 
R 
S 
T 
U 
V 
W 
X 
Y 
Z 
[ 
\ 
] 
^ 
_ 
` 
a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 
l 
m 
n 
o 
p 
q 
r 
s 
t 
u 
v 
w 
x 
y 
z 
{ 
| 
} 
~ 

を置く、私は自分自身に疑問に思った「Rubyでのループの順序は何ですか?」最高の優先順位と最低の優先順位は何ですか?この質問が基本的であれば申し訳ありません。私は誰もが知っているサイトを見つけていない。疑問がある場合は質問してください。私はこれが十分明確であることを望む!

+4

あなたの見解のため:[ASCIIテーブル](http://www.asciitable.com/index/asciifull.gif) –

答えて

3

この順序は、文字のバイナリ表現によって定義されます。これは、標準で定義されています。使用される標準はASCII(情報交換のためのアメリカ標準コード)です。

http://www.asciitable.com/

他の符号化規格は、IBMのミッドレンジコンピュータで使用されるEBCDICのように、存在します。

+0

これはとても意味をなさない!私は私のASCIIテーブルを知っていて、私はそれについても考えていませんでした。最初の値は\ 0です。 nullでループを開始できますか?それはどうしますか? – James

+0

これは別個のオブジェクト型であるため、単に 'nil'を使うことはできませんが、ヌル値を持つ文字列を作成することができます。 'null_value = [00] .pack( 'c *')'とすると、範囲の開始点として 'null_value'を使うことができます。 ASCIIで表示可能な表現を持たない文字は、16進数値で表示されるだけなので、16進値が1A(00011010)の文字は "\ x1A"として印刷されます – SteveTurczyn

1

これは優先度ではなく、値の順序です。すでに述べたように、文字は、ASCII表現(例えば、 'a'の値は97、 'z'の値は122)を持ちます。あなたはこれをしようと自分のためにこれを見ることができました

('a'..'z').each do |c| 
    puts c.ord 
end 

同様に、これも動作するはずです:

(97..122).each do |i| 
    puts i.chr 
end 
2

for/in is (mostly) syntactic sugar for each、そう

for i in '.'..'~' do puts i end 

は((おおよそ)と等価ですモジュロローカル変数スコープ)〜

順番にそれぞれを渡し、範囲の各要素についての

each {| i | block }rng

反復し:私達は私達の答え(太字強調鉱山)のためRange#eachを見ていることを意味

('.'..'~').each do |i| puts i end 

ブロックに。

の範囲のbeginオブジェクトがsuccメソッドをサポートする場合にのみ、各メソッドを使用できます。オブジェクトにsuccメソッドが定義されていない場合(Floatのような)、TypeErrorが生成されます。

そしてthe documentation for the Range class itself詳細を提供する:

カスタムオブジェクト範囲で

範囲は<=>演算子を使用して比較することができる任意のオブジェクトを使用して構築することができます。 範囲をシーケンスとして扱うメソッド(#eachおよびEnumerableから継承したメソッド)では、beginオブジェクトがsuccメソッドを実装して、次のオブジェクトをシーケンスに戻すと想定しています。それは直接綴られていない間

そう、繰り返しsuccメッセージを送る

  1. によってRange#each作品が返されたオブジェクトに、その後オブジェクト(およびを始めることは明らかですsuccによって、その後からを使用オブジェクトに現在の要素を比較オブジェクト、等)、及び
  2. その宇宙船は、比較演算子を組み合わせて、別のオブジェクトを生成するか、ループを終了するかを決定します。

    succnew_str

    STRに後継者を返します:私たちは次のString#succを見ていることを意味

。後続文字は、文字列内の右端の英数字(または英数字がない場合は右端の文字)から始まる文字をインクリメントすることによって計算されます。数字を増やすと常に別の数字が表示され、文字を増やすと同じ文字の別の文字が表示されます。 非英数字をインクリメントすると、基になる文字セットの照合順序が使用されます。

基本的には、これが意味する:手紙をインクリメント

  • はあなたが
  • が数字をインクリメント期待し、あなたが
  • は、文字でも数字でもない何かをされてインクリメント期待し任意で文字列の文字セットに依存するcollating sequence

この特定のcaあなたの文字列の照合順序が何であるか教えてくれませんでしたが、それはASCIIであると仮定しています。つまり、口語の意味はASCIIbetical orderingです。

+0

優れた答えです。 – SteveTurczyn