我只是在挖ruby,想知道为什么我无法使用可枚举方法(first
或last
)为数组元素重新赋值。
我知道我可以使用索引分配值,但我想了解更多相关信息。我在here和here找不到太多解释。
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
谢谢
答案 0 :(得分:4)
可以通过两种方式阅读这个问题:
((\w+['-])+\w+)
?原因是,为了能够使用first
,foo.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
。
Array#first=
的原因是什么? 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个元素。写这样的方法会违反单一责任原则。