不使用“ .length”或“ .size”方法的字符串计数?

时间:2019-09-24 20:27:26

标签: ruby string

我是红宝石的新手,正在练习代码。我想通过自写代码来计算字符串中的字母,而不使用fs.read_parquet() #length方法。我已经在线搜索,但是找不到与我的查询有关的任何内容。如果有人可以在这个简单的程序中帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

其他选项,将String#chars与索引映射,然后选择最后一个:

str = "123456"
str.chars.map.with_index { |_, i| i + 1 }.last
#=> 6

它会生成一个数组,但是我们这里并不是在寻找效率。


甚至甚至将String#index与偏移量一起使用:

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