Ruby: справочные материалы, чтобы узнать больше о присвоении значений себе - PullRequest
1 голос
/ 05 октября 2011

Мне не удалось найти документацию или какой-либо справочный материал по этой теме: Ruby: Как написать метод взрыва, например map?

Кто-нибудь знает что-нибудь, что я могу прочитать, чтобы узнать больше об этой специфической вещи?

РЕДАКТИРОВАТЬ: В свете комментариев, я исправляю этот вопрос следующим образом:

Итак, мы обнаружили, что массивами и строками можно манипулировать с помощью этой записи массива self:

self[i]=

Но это еще не вся история манипулирования значением себя. Существует множество справочных материалов о сфере самости и ее значении в ее нынешнем контексте, но я мало что нашел в self методах манипуляции.

Что если я захочу написать свою собственную версию String chomp! или другой метод взрыва? Я заблокирован с помощью self[0]...self[i]? А как насчет других классов?

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Сначала прочитайте статью в Википедии о себе (даже если она вообще не упоминает Ruby).

Короче говоря:

  • Ruby позаимствовал множество концепций из других языков, а self взято из Smalltalk.
  • self называется в Smalltalk псевдопеременной, что означает, что она является переменной, но она устанавливается средой выполнения, а не программой или программистом.
  • self ссылается все время на получателя сообщения. super ссылается на суперкласс этого сообщения, который реализован методом, в котором находится ссылка super. (Рад, что вы не запросили super).
  • self в Ruby (как в Smalltalk) постоянно ссылается на текущий объект, и это может быть экземпляром класса или даже самого класса. Поэтому, если вы определяете методы на стороне класса (только для вызова в классе), даже там self ссылается на объект, который является классом. Таким образом, в Ruby можно использовать только self, вам никогда не придется записывать имя класса для обозначения получателя. Это немного помогает при рефакторинге.

Если у вас есть все это, взгляните на Ruby метапрограммирования , который рассказывает вам еще несколько хитростей, как использовать self, классы, собственные классы и некоторые другие интересные вещи.

0 голосов
/ 05 октября 2011

(так как это немного долго для комментария ...)

Действительно, вы не можете изменить значение self, но вы можете изменить свойства на self, что и являетсяпроисходит в вашем примере.

Позвольте мне уточнить.Скажем, у вас есть класс Foo и вы делаете что-то вроде этого:

f = Foo.new
f.bar = 3
puts f.bar # => 9

"2" ??На самом деле происходит то, что вы вызываете метод bar= для f с аргументом 1.Метод bar= может выглядеть примерно так:

class Foo
  def bar=(val)
    @bar = val**2 # square the given value and assign it to the instance
  end             # variable @bar

  def bar
    @bar          # return the instance variable @bar -- a shortcut for this is
  end

  # we could get rid of the second method, though, but using attr_reader:
  attr_reader :bar
end

Хорошо, а что по этому поводу?

f = Foo.new
puts f[5] # => 10

"10" ?!Ага.Опять же, [] - это просто синтаксический сахар для простого старого метода.Примерно так:

class Foo
  def [](val)
    val * 2 # Ruby just takes the value you put between [] and gives it to you as
  end       # the first parameter
end

И наконец:

f = Foo.new
f[:bar] = 99
puts f[:bar] # => 100

Да, вы уже догадались, это просто еще один вызов метода.Например:

class Foo
  @my_hash = {}

  def []=(key, val)         # Ruby gives us the value between the [] as the first
    @my_hash[key] = val + 1 # parameter and the value after the = as the second,
  end                       # and we use them to set a value on an internal
                            # instance variable...
  def [](key)
    @my_hash[key]           # ...and we can use the "getter" to get a value from 
  end                       # the instance variable.
end

Вы правы, этот материал не все освещен в одном удобном источнике, поэтому я надеюсь, что это поможет.Не стесняйтесь комментировать, если вам нужны дальнейшие объяснения.

...