我正在尝试强制使用密码。当我玩一些循环时,我注意到有一个特定的顺序。就像,如果我有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中的循环顺序是什么?”什么字符是最高优先级,哪个是最低优先级?对不起,这个问题是基本的。我还没有找到任何人都知道的网站。如果您对这个问题有疑问,请询问。我希望这很清楚!
答案 0 :(得分:3)
订单由字母的二进制表示定义。反过来,它由标准定义。使用的标准是ASCII(美国信息交换标准码)。
存在其他编码标准,例如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
的工作原理是
succ
消息发送到开始对象(然后发送到succ
返回的对象,然后发送到 对象,等等)和<=>
太空船组合比较运算符将当前元素与 end 对象进行比较,以确定是否生成另一个对象或结束循环。这意味着我们必须查看下一个String#succ
:
succ
→new_str
返回 str 的后继者。后继是通过从字符串中最右边的字母数字(或最右边的字符,如果没有字母数字)开始递增字符来计算的。增加一个数字总是会产生另一个数字,而增加一个字母会产生同一个案例的另一个字母。 增加非字母数字使用基础字符集的整理顺序。
基本上,这意味着:
在这种特殊情况下,您没有告诉我们您的字符串的整理顺序是什么,但我认为它是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