ArrayMine наследуется от Array, и вы можете инициализировать массивы Ruby следующим образом.
>> rooms = Array[3,4,6]
=> [3, 4, 6]
совпадает с
>> rooms = [3,4,6]
=> [3, 4, 6]
Также довольно странно выглядящий def join( sep = $,, format = "%s" )
использует предопределенную переменную $,
, которая является разделителем выходного поля для печати, и Array#join
.
Это также можно было бы сделать так
rooms=["b",52,"s"]
print "We have " + rooms.map{|s| s.to_s+" bed"}.join(", ") + " rooms available."
Причина, по которой вы не можете делать то, что пытаетесь сделать с String
, заключается в том, что присваивание - это не метод класса, а [] в Array
. Просто new
вместо этого.
>> s = Substring.new("abcd")
=> "abcd"
>> s.checking_next
=> "abce"
Вы не можете переопределить присваивание в Ruby, это только так, что методы сеттера выглядят как присваивание, но на самом деле они являются вызовами методов и поэтому могут быть переопределены.
Если вы чувствуете, что хотите быть хитрым и по-прежнему хотите поведение, подобное a=SubArray[1,2,3]
, вы можете создать <<
метод класса примерно так:
class Substring < String
def next_next()
self.next().next()
end
def self.<<(val)
self.new(val)
end
end
>> sub = Substring<<"abcb"
=> "abcb"
>> sub.next_next
=> "abcd"
>> sub<<" the good old <<"
=> "abcb the good old <<"
>> sub.class<<"this is a new string"
=> "this is a new string"