Ruby: булево соглашение о присвоении имен атрибута и использование

Что касается соединения, я полагаю, что это могло бы выглядеть немного менее сложным:

public String join (Collection<String> c) {
    StringBuilder sb=new StringBuilder();
    for(String s: c)
        sb.append(s);
    return sb.toString();
}

я не добираюсь для использования синтаксиса Java 5 так же, как я хотел бы (Хотите верьте, хотите нет, я использовал 1.0.x в последнее время), таким образом, я могу быть немного ржавым, но я уверен, что понятие корректно.

дополнение редактирования: Строка добавляет, может быть достаточно медленным, но если Вы работаете над кодом GUI или некоторой коротко рабочей стандартной программой, действительно не имеет значения при взятии.005 секунд или.006, поэтому если у Вас был набор, названный "joinMe", что Вы хотите добавить к существующей строке "цель", это не было бы ужасающе, чтобы просто встроить это:

for(String s : joinMe)
    target += s;

Это довольно неэффективно (и дурная привычка), но ничто, что Вы сможете чувствовать, если не будет или тысячами строк или это в огромном цикле, или Ваш код является действительно очень важной производительностью.

, Что еще более важно, легко помнить, закоротить, быстрый и очень читаемый. Производительность является не всегда автоматическим победителем в проектных решениях.

32
задан Ripon Al Wasim 8 January 2015 в 11:07
поделиться

5 ответов

Редактировать: три года спустя; времена, они меняются ...

Ответ Джулика - это самый простой и лучший способ решить проблему в наши дни:

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end

Мой ответ на исходный вопрос следующий, для потомков…


Краткий версия:

Нельзя использовать вопросительный знак в имени переменной экземпляра.

Более длинная версия:

Возьмем, например, attr_accessor: foo - это просто концептуально немного синтаксического сахара для следующего:

def foo
  @foo
end

def foo=(newfoo)
  @foo = newfoo
end

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

Наилучшее приближение, которое я могу сделайте то, что вы собираетесь здесь…

class MyClass

  def initialize
    @awesome = true
  end

  def awesome?
    @awesome
  end

end

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

Ура!


Изменить, два года спустя, после недавний комментарий:

  1. Ruby обеспечивает соблюдение определенных соглашений об именах. Символы в Ruby не могут иметь вопросительных знаков. Таким образом, вызовы : my_boolean_attribute? оба завершатся ошибкой NameError . Изменить: неверно, просто используйте синтаксис в кавычках для символа, например, : "my_attribute?"
  2. Символы неизменяемы, попытка присвоить одному из них вызовет SyntaxError .
42
ответ дан 27 November 2019 в 19:57
поделиться

Самый простой способ быстро добавить «метод вопроса» - использовать псевдоним для метода чтения

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end 
40
ответ дан 27 November 2019 в 19:57
поделиться

Символ attr_accessor означает, что имя переменной - @my_boolean_attribute , так что вам следует установить именно это (а не символ).

Кроме того, вы не можете использовать? для переменных просто имена методов.

6
ответ дан 27 November 2019 в 19:57
поделиться

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

 # inject the convenience method into the definition of the Object class
 class Object
   def Object::bool_attr(attrname)
     class_eval { define_method(attrname.to_s,
          lambda { instance_variable_get('@' + attrname.to_s.chop) }) }
     class_eval { define_method(attrname.to_s.chop+"=",
          lambda { |x| instance_variable_set('@'+attrname.to_s.chop, x) }) }
   end
 end

 ### somewhere later

 class MyClass

   bool_attr :my_boolean_attribute?

   def initialize
     @my_boolean_attribute = true
   end
 end

 # yet even more later

 foo = MyClass.new
 bar = MyClass.new

 foo.my_boolean_attribute = 1
 puts foo.my_boolean_attribute?
 puts bar.my_boolean_attribute?

При таком подходе вы можете быть СУХИМ и получить тоже хороший вопросительный знак. Вам просто может потребоваться выбрать имя получше, чем « bool_attr », например, « bool_attr_accessor » или что-то подобное.

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

О, и почти забыл включить обязательную ссылку: Четкое видение метаклассов

3
ответ дан 27 November 2019 в 19:57
поделиться

? это соглашение об именах методов, а не о переменных. Вы не можете использовать переменную экземпляра с именем @foo? , однако вы можете использовать переменную с именем @foo и назвать (созданный вручную) метод получения foo? , если хотите.

5
ответ дан 27 November 2019 в 19:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: