Синтаксис точки против синтаксиса передачи параметров - PullRequest
1 голос
/ 13 января 2012

Можно ли вызывать только основные методы Ruby с использованием синтаксиса object.functionName?Можно ли самостоятельно создавать методы, которые можно вызывать с использованием точечного синтаксиса?

Для этого метода:

def namechanger (name)

    nametochange = name
    puts "This is the name to change: #{nametochange}"

end

Первый из приведенных ниже работает, второй - нет.

namechanger("Steve")

"Steve".namechanger

Я получаю сообщение об ошибке "Steve".namechanger

Ошибка:

rb:21:in `<main>': private method `namechanger' called for "Steve":String (NoMethodError)

Ответы [ 5 ]

3 голосов
/ 13 января 2012

Да, вы можете добавлять методы в класс String для достижения желаемого эффекта; переменная "self" относится к объекту, который получает вызов метода.

class String
  def namechanger
    "This is the name to change: #{self}"
  end
end
"Steve".namechanger # => This is the name to change: Steve

Эта практика известна как исправление обезьян и должна использоваться осторожно.

1 голос
/ 13 января 2012

Вместо monkeypatching вы можете всегда использовать подкласс и таким образом:

  1. Уточните, что вы думаете об объекте на самом деле .
  2. Получите все методы String

Например:

class PersonName < String  
  def namechanger  
    puts "This is the name to change: #{self}"  
  end  
end  

s = PersonName.new( "Iain" )  
s.namechanger

This is the name to change: Iain  
=> nil
0 голосов
/ 13 января 2012

Вы можете сделать

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end

Разница в том, что ваш первый пример - это метод, который (в основном) определен глобально, который принимает строку и работает с ней.Этот код выше, однако, определяет метод с именем «namechanger», который не принимает параметров, и определяет его непосредственно в классе String.Таким образом, любой и все строки в вашем приложении будут иметь этот метод.

Но, как сказал pst, вам, вероятно, не стоит углубляться в этот стиль программирования, пока вы не познакомитесь немного с Ruby, чтобы вы могли большелегко увидеть все плюсы и минусы такого обезьяноподготовки.Одним из соображений является то, что у вас, вероятно, есть много строк, которые не представляют имен, и для этих строк не имеет большого смысла иметь метод с именем namechanger.

Тем не менее, если ваша цельэто просто немного повеселиться с Руби, посмотреть, что вы можете сделать, пойти на это, но не забывайте быть более осторожным в проектах, которые будут иметь более длительный срок службы.

0 голосов
/ 13 января 2012

Если вы хотите иметь возможность вызывать "Steve".namechanger, вы должны сделать namechanger метод класса String следующим образом:

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end

Обычно это называется «исправлением обезьян», и вы можете немного улучшить общее владение Ruby, прежде чем приступать к рассмотрению связанных с этим вопросов и обсуждений.

0 голосов
/ 13 января 2012

В первой форме у вас есть метод, который принимает параметр, который сильно отличается от метода, который не принимает никаких параметров.Позвольте мне проиллюстрировать

ruby namechanger("Steve")

Ищет метод с именем namechanger и передает ему строковый аргумент.Прямо вперед.Он ищет в каком-то неизвестном контексте, возможно, в локальных системах другого метода, который будет искать его на объекте, который получает этот метод.

ruby "Steve".namechanger

- это метод, который не принимает аргументов, которыесуществует на String.Обычно эти методы используют неявный параметр self для работы с некоторыми данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...