Ruby булевы методы - PullRequest
       0

Ruby булевы методы

0 голосов
/ 23 января 2020

У меня есть метод, который я буду использовать sh, чтобы сделать мой код немного более разборчивым (на мой взгляд)

Мой код:

def format_chosen_address(address)
  # Add country before the postcode
  postcode = address.split("\n").last
  country = postcode.is_welsh? ? 'WALES' : 'ENGLAND'
  address.split("\n").insert(-2, country).join(' ')
end


def is_welsh?
    welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
    welsh_postcodes.include? self
end

Я получаю следующее исключение:

NoMethodError: undefined method `is_welsh?' for "SA1 6AZ":String

Где я ошибся, потому что таким образом можно использовать мысленные методы self и boolean?

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

def format_chosen_address(address)
  # Add country before the postcode
  postcode = address.split("\n").last
  country = is_welsh?(postcode) ? 'WALES' : 'ENGLAND'
  address.split("\n").insert(-2, country).join(' ')
end

def is_welsh?(postcode
  welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
  welsh_postcodes.include? postcode
end

Ответы [ 3 ]

2 голосов
/ 23 января 2020

Проблема в том, что вы вызываете postcode.is_welsh?, что означает, что вы вызываете метод is_welsh? для строки, но вы определяете метод не для String, а внутри другого класса.

На самом деле, Я советую добавлять методы, подобные классу String. Он слишком специфичен c для загрязнения всего пространства имен String. Вместо этого я предлагаю оставить этот метод как (вероятно, как private) вспомогательный метод и передать ему строку почтового кода в качестве аргумента:

def is_welsh?(postcode)
  welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
  welsh_postcodes.include? postcode
end

и вызвать его следующим образом:

country = is_welsh?(postcode) ? 'WALES' : 'ENGLAND'
1 голос
/ 23 января 2020

Вы можете определить is_welsh? внутри класса String следующим образом:

class String
  def is_welsh?
    welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
    welsh_postcodes.include? self
  end
end

Но для каждой строки не имеет смысла иметь метод, который сообщает, что это Wel sh или не. Поэтому лучше сделать метод, который принимает параметр (как ваш второй пример в вопросе):

def is_welsh?(postcode)
  welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
  welsh_postcodes.include? postcode
end
0 голосов
/ 23 января 2020

Вы также можете использовать модуль для добавления определенных помощников в синглтон-класс строки. Это означает, что они добавляются только для этого указанного c экземпляра String, а не для всех строк.

module PostcodeHelpers
  def is_welsh?
    welsh_postcodes = ['SA1 6AZ', 'SA7 9BR', 'CF10 1AX']
    welsh_postcodes.include?(self)
  end

  def country
    is_welsh? ? 'WALES' : 'ENGLAND'
  end
end

def format_chosen_address(address)
  *lines, postcode = address_lines(address)
  [*lines, postcode.country, postcode].join(' ')
end

private # assuming you are in class or module context

def address_lines(address)
  *lines, postcode = address.split("\n")

  # Default to empty string since you don't want to extend nil by accident.
  postcode ||= ''
  postcode.extend(PostcodeHelpers)

  [*lines, postcode]
end

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

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