Ruby循环顺序?
我正在尝试强制密码。 当我玩一些循环时,我注意到有一个特定的顺序。 比如说,如果我for i in '.'..'~'
有for i in '.'..'~'
话。’〜 for i in '.'..'~'
它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中的循环顺序是什么?” 什么字符是最高优先级,哪个是最低优先级? 对不起,这个问题是基本的。 我还没有找到任何人都知道的网站。 如果您对这个问题有疑问,请询问。 我希望这很清楚!
订单由字母的二进制表示定义。 反过来,它由标准定义。 使用的标准是ASCII(美国信息交换标准码)。
存在其他编码标准,例如IBM中端计算机使用的EBCDIC。
for
/ in
是(大部分) each
语法糖 ,所以
for i in '.'..'~' do puts i end
是(大致)等价(模数局部变量范围)
('.'..'~').each do |i| puts i end
这意味着我们必须查看Range#each
答案( 大胆强调我的):
each {| i | block }
each {| i | block }
→rng
迭代范围的元素,将每个元素依次传递给块。
只有在范围的begin对象支持
succ
方法时,才能使用每个方法 。 如果对象没有定义succ
方法(如Float),则引发TypeError
。
Range
类本身的文档提供了更多详细信息:
范围中的自定义对象
可以使用可以使用
<=>
运算符进行比较的任何对象构建范围。 将范围视为序列(#each
和从Enumerableinheritance的方法)的方法期望begin对象实现succ
方法以按顺序返回下一个对象 。
因此,虽然没有直接拼写,但很明显Range#each
有效的
- 重复发送
succ
消息到begin对象(然后发送到succ
返回的对象,然后发送到该对象,依此类推),以及 - 使用
<=>
太空船组合比较运算符将当前元素与结束对象进行比较,以确定是生成另一个对象还是结束循环。
这意味着我们必须查看String#succ
next:
succ
→new_str
返回str的后继。 后继是通过从字符串中最右边的字母数字(或最右边的字符,如果没有字母数字)开始递增字符来计算的。 增加一个数字总是会产生另一个数字,并且递增一个字母会产生同一个案例的另一个字母。 增加非字母数字使用基础字符集的整理顺序 。
基本上,这意味着:
- 递增一封信就能满足您的期望
- 递增数字符合您的预期
- 递增既不是字母也不是数字的东西是任意的,并且取决于字符串的字符集的整理顺序
在这种特殊情况下,您没有告诉我们您的字符串的整理顺序是什么,但我认为它是ASCII ,这意味着您可以得到通俗地称为ASCIIbetical排序的内容 。
这不是优先权,而是价值的顺序。 如前所述,字符具有自己的ASCII表示 (例如,’a’值为97,’z’值为122)。
您可以尝试这样做:
('a'..'z').each do |c| puts c.ord end
类似地,这应该也有效:
(97..122).each do |i| puts i.chr end