我是红宝石的新手,正在练习代码。我想通过自写代码来计算字符串中的字母,而不使用fs.read_parquet()
或#length
方法。我已经在线搜索,但是找不到与我的查询有关的任何内容。如果有人可以在这个简单的程序中帮助我,我将不胜感激。
答案 0 :(得分:3)
其他选项,将String#chars与索引映射,然后选择最后一个:
str = "123456"
str.chars.map.with_index { |_, i| i + 1 }.last
#=> 6
它会生成一个数组,但是我们这里并不是在寻找效率。
str = "aaaa"
str.index(str[-1], -1) + 1
#=> 4
从末尾开始查找最新字符的索引。
答案 1 :(得分:2)
您可以使用任何枚举字符的String
方法来做到这一点。最明显的是String#each_char,就像@knut在评论中提到的那样。
def str_length(str)
enum = str.each_char
n = 0
loop do
enum.next
n += 1
end
n
end
str_length "Zaphod"
#=> 6
让我们看看这里发生了什么。
str = "Zaphod"
enum = str.each_char
#=> #<Enumerator: "123456":each_char>
n = 0
loop do
s = enum.next
n += 1
puts "s = #{s}, n = #{n}"
end
n #=> 6
打印
s = Z, n = 1
s = a, n = 2
s = p, n = 3
s = h, n = 4
s = o, n = 5
s = d, n = 6
请参见Enumerator#next。在执行enum.next #=> "d"
之后,将再次执行enum.next
,从而引发StopIteration
异常。 Kernel#loop通过退出循环来处理该异常。
正如我在一开始所说的,可以使用任何枚举字符的String
方法。例如,enum = str.gsub(/./)
。
对于实现实现枚举集合元素的方法的任何类,可以使用相同的方法。例如,我们可以向Enumerable
模块添加一个方法,然后该方法可用于包含该模块的每个类。
module Enumerable
def my_length
enum = each
n = 0
loop do
enum.next
n += 1
end
n
end
end
[1,2,3,4].my_length
#=> 4
{ a: 1, b: 2 }.my_length
#=> 2
(1..5).my_length
#=> 5