`length`方法有待解释

时间:2015-08-12 23:10:36

标签: ruby

示例1是一个数组循环:

示例1

counter = []
while counter.length < 3
  puts("Tell me a cool thing!")
  counter2 = gets.chomp
  counter.push(counter2)
end
puts("Here's some cool things in backward order:")
counter3 = counter.length - 1
while counter3 >= 0
  puts(counter[counter3])
  counter3 = counter3 - 1
end

第二个例子是循环:

示例2

counter = 1
while counter.length < 11
  puts counter
  counter += 1
end

length应用于示例2,我收到错误。为什么?除了计算整数的总长度之外,length的目的是什么?

4 个答案:

答案 0 :(得分:1)

以最简单的方式解释:

如果它是一个数组,它可以在技术上用.length“测量”内容。 例如,如果我的篮子中有3个鸡蛋,并且我使用了.length,我会得到答案3,对吗?

现在,如果我们只有一个鸡蛋并且我画了一个3,并且我告诉你要计算鸡蛋的数量,它基本上总是评估为一个,这不是真正的你试图完成,所以Ruby抛出异常,因为它不允许这种行为。 (它不允许在.length

上调用Fixnum

所以在第一个例子中,您可以这样想:

 #- Basket                  => your array (counter[])
 #- Egg                     => an element in the array
 #- A Painted number on egg => the *value* of the element in the array

# I have an empty basket
basket = []

# While my basket has less than 3 eggs, keep letting the user add more eggs
while basket.length < 3

  puts("Tell me a cool thing!")

  # Get an egg from the user
  egg = gets.chomp             #=> gets.chomp is the number the user paints on the egg

  # Put that egg in the basket
  basket.push(egg)
end

# So how many eggs are in the basket?
puts basket.length   #=> 3

为了简单起见,我将跳过其余部分,直接进入第二个例子:

第二个例子 相同的情况。篮子,鸡蛋和油漆。

# Hey! What happened to the basket? Arrays are baskets! This is just some thing! I guess you want to PAINT a 1 on the basket?
basket = 1

# While my only basket that has a 1 painted on it is less than 11 baskets
while basket.length < 11

   # Show me the number that painted on my only basket
   puts basket

   # Now paint a 2 on my only basket
   basket += 1
end

请注意我说我唯一的篮子的部分?在这种情况下,您将始终只有一个篮子。我们所做的只是在每个循环上绘制一个不同的数字。

<强> TL; DR

Fixnum没有.length方法。如果确实如此,几乎每个循环都是无限循环,因为1&lt; 11永远不会评价为假。这是因为只有一个 Fixnum,它所代表的值基本上是无关紧要的,并且基本上是在盒子外面绘制的标记。

如果你在一个盒子上画5,这并不意味着你有5个盒子。

数组采用.length方法,因为你可以计算它们内部的数量,就像计算一篮子里的蛋数一样。

希望我帮忙!

答案 1 :(得分:0)

示例1 使用length来为您提供数组counter的长度。

示例2 ,独立执行,没有任何意义。 Fixnum没有方法length

答案 2 :(得分:0)

重新举例1

Cosider这个示例数组:

array_one = [1, 3, 4, 8]

它有多少元素? 4.所以,如果我在其上调用.length方法:

array_one.length #=> 4

&#39; 4&#39;返回,因此.length只返回数组中的元素数。如果你考虑一下,它有点像使用元素作为单位的长度。

继续之后,计数器实际上是一个空数组

counter = []

有多少元素?零,因此

counter.length #=> 0.

&#39; 0&#39;归还。

重新做例2

在这种情况下counter = 1(并且与示例1中的计数器无关)。因此,您已将数字 1分配给变量计数器。这绝对不是一个数组。简而言之,您无法在数字上应用.length方法。例如,尝试在以下示例中应用。length

2.length #=> NoMethodError...

444.length #=> NoMethodError...

在这里,您尝试在数字上应用.length方法,默认情况下对Ruby没有意义并返回NoMethodError。所以在你的例子中:

counter.length #=> NoMethodError

出现错误,因为您尝试在号码上调用.length方法,而您无法做到。

在Ruby中,整数属于 FixNum类,默认情况下没有.length方法(因此NoMethodError)。如果我是你,如果可以的话,我会尝试更好地理解课程和方法。这对你真的很有用。

答案 3 :(得分:-1)

因为默认情况下length未定义Fixnum