ruby使用可枚举方法将值赋给数组

时间:2015-09-27 18:15:04

标签: arrays ruby

我只是在挖ruby,想知道为什么我无法使用可枚举方法(firstlast)为数组元素重新赋值。

我知道我可以使用索引分配值,但我想了解更多相关信息。我在herehere找不到太多解释。

array1 = [1,2,3,4,5]
array1.first # returns 1
array1.first = 7
NoMethodError: undefined method `first=' for [1, 2, 3, 4, 5]:Array

Ruby 2.0

谢谢

3 个答案:

答案 0 :(得分:4)

可以通过两种方式阅读这个问题:

  1. 从技术上讲,为什么索引解决方案有效,而不是((\w+['-])+\w+)
  2. 原因是,为了能够使用firstfoo.bar = :baz的类必须实现foo方法。

    bar=

    核心库确实实现了Array#[]=,但没有class X def initialize(y) @y = y end def y @y end end x = X.new(3) x.y # => 3 x.y = 7 # => NoMethodError: undefined method `y=' for #<X:0x007fb272726d80 @y=3> class X def initialize(y) @y = y end def y @y end def y=(new_y) @y = new_y end end x = X.new(3) x.y # => 3 x.y = 7 x.y # => 7

    1. 他们决定不实施Array#first=的原因是什么?
    2. Array#first=方法实际上是Enumberable的一部分,如果一个类实现了first,如果没有first=的实现,它将看起来不一致。

      这不可能发生,因为对于某些枚举这样的方法没有意义(Enumerator)。它还需要更多人才能获得可枚举的功能。截至目前,要使类成为可枚举的,只需要实现Enumerable#first=方法并包含Enumerable模块。

答案 1 :(得分:1)

数组方法.first是属性读取器方法,它没有写入权限。查看Ruby Documentation数组。您需要在数组中的特定索引处重新分配值,只需按照@Andrey写的那样

答案 2 :(得分:0)

实际上你可以创建first(12),想象一下如果设置first=(12,arr)方法首先是多么尴尬,方法变得模糊(如果数组没有12个元素,是否应该添加元素或应该编辑x个第一个元素)因为5个元素的数组的first(12)返回5个元素。写这样的方法会违反单一责任原则。