Что касается соединения, я полагаю, что это могло бы выглядеть немного менее сложным:
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;
Это довольно неэффективно (и дурная привычка), но ничто, что Вы сможете чувствовать, если не будет или тысячами строк или это в огромном цикле, или Ваш код является действительно очень важной производительностью.
, Что еще более важно, легко помнить, закоротить, быстрый и очень читаемый. Производительность является не всегда автоматическим победителем в проектных решениях.
Редактировать: три года спустя; времена, они меняются ...
Ответ Джулика - это самый простой и лучший способ решить проблему в наши дни:
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
- в конце концов, может быть явно указано, что вы работаете напрямую с логическим атрибутом. Обычно я сохраняю суффикс вопросительного знака, когда реализую метод, логическое возвращаемое значение которого основано на несколько более сложных условиях, чем просто значение атрибута.
Ура!
Изменить, два года спустя, после недавний комментарий:
: my_boolean_attribute?
оба завершатся ошибкой NameError
. : "my_attribute?"
SyntaxError
. Самый простой способ быстро добавить «метод вопроса» - использовать псевдоним для метода чтения
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
Символ attr_accessor
означает, что имя переменной - @my_boolean_attribute
, так что вам следует установить именно это (а не символ).
Кроме того, вы не можете использовать? для переменных просто имена методов.
Метапрограммирование с обезьяньим исправлением - может быть, его можно сделать более элегантным, это всего лишь краткий набросок, и я уже некоторое время не занимался метапрограммированием ...
# 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 » или что-то подобное.
Определения, которые я сделал, немного капризны в контексте Ощутите, что вопросительный знак присутствует в исходном символе. Вероятно, более четким подходом было бы избежать вопросительного знака в имени символа и добавить его во время определения метода - это должно быть менее запутанным.
О, и почти забыл включить обязательную ссылку: Четкое видение метаклассов
? это соглашение об именах методов, а не о переменных. Вы не можете использовать переменную экземпляра с именем @foo?
, однако вы можете использовать переменную с именем @foo
и назвать (созданный вручную) метод получения foo?
, если хотите.