Ruby循环顺序?

时间:2016-09-12 20:47:08

标签: ruby loops for-loop

我正在尝试强制使用密码。当我玩一些循环时,我注意到有一个特定的顺序。就像,如果我有for i in '.'..'~'那就放

.
/
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中的循环顺序是什么?”什么字符是最高优先级,哪个是最低优先级?对不起,这个问题是基本的。我还没有找到任何人都知道的网站。如果您对这个问题有疑问,请询问。我希望这很清楚!

3 个答案:

答案 0 :(得分:3)

订单由字母的二进制表示定义。反过来,它由标准定义。使用的标准是ASCII(美国信息交换标准码)。

http://www.asciitable.com/

存在其他编码标准,例如IBM中端计算机使用的EBCDIC。

答案 1 :(得分:2)

for / in is (mostly) syntactic sugar for each,所以

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

是(大致)等效(模数局部变量范围)到

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

这意味着我们必须查看Range#each的答案(粗略强调我的):

  

each {| i | block }rng

     

迭代范围的元素,将每个元素依次传递给块。

     

只有当范围的起始对象支持succ方法时,才能使用每种方法。如果对象没有定义TypeError方法(如Float),则会引发succ

the documentation for the Range class itself提供了更多详细信息:

  

范围中的自定义对象

     

可以使用可以使用<=>运算符进行比较的任何对象构建范围。 将范围视为序列(#each和从Enumerable继承的方法)的方法期望begin对象实现succ方法以按顺序返回下一个对象

所以,虽然它没有直接拼写,但很明显Range#each的工作原理是

  1. 反复将succ消息发送到开始对象(然后发送到succ返回的对象,然后发送到 对象,等等)和
  2. 使用<=>太空船组合比较运算符将当前元素与 end 对象进行比较,以确定是否生成另一个对象或结束循环。
  3. 这意味着我们必须查看下一个String#succ

      

    succnew_str

         

    返回 str 的后继者。后继是通过从字符串中最右边的字母数字(或最右边的字符,如果没有字母数字)开始递增字符来计算的。增加一个数字总是会产生另一个数字,而增加一个字母会产生同一个案例的另一个字母。 增加非字母数字使用基础字符集的整理顺序

    基本上,这意味着:

    • 递增一封信符合您的期望
    • 递增数字符合您的预期
    • 递增既不是字母也不是数字的东西是任意的,取决于字符串的字符集collating sequence

    在这种特殊情况下,您没有告诉我们您的字符串的整理顺序是什么,但我认为它是ASCII,这意味着您可以得到通俗地称为ASCIIbetical ordering的内容。

答案 2 :(得分:1)

这不是优先权,而是价值的顺序。如前所述,字符有自己的 ASCII表示(例如,'a'值为97,'z'值为122)。

你可以试着这样做:

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

类似地,这也应该有效:

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