Руби, я не мог найти, как на самом деле работает следующий код - PullRequest
0 голосов
/ 28 января 2010
class ArrayMine < Array

  def join( sep = $,, format = "%s" )

    collect do |item|
      sprintf( format, item )
    end.join( sep )
  end

end

=> rooms = ArrayMine[3, 4, 6]    #i couldn't understand how this line works

print "We have " + rooms.join( ", ", "%d bed" ) + " rooms available."

Я пытался сделать то же самое со строкой, но возникла ошибка.

    thank you...

Ответы [ 3 ]

3 голосов
/ 28 января 2010

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"
1 голос
/ 28 января 2010

Вы просто вызываете метод класса []:

class Spam
  def self.[]( *args )
    p args
  end
end
>> Spam[3,4,5]
[3, 4, 5]
1 голос
/ 28 января 2010

Для строки измените %d bed на %s bed

irb(main):053:0> rooms = ArrayMine["a","b","c"]
=> ["a", "b", "c"]

irb(main):055:0> print "We have " + rooms.join( ", ", "%s bed" ) + " rooms available."
We have a bed, b bed, c bed rooms available.=> nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...