Комментарии 16
Еще можно вот так:
class Struct {
fun <T> String.to(valut:T) {
}
operator fun <T> String.invoke(value:T) {
}
}
fun build(builder:Struct.()->Unit): Struct = Struct().apply(builder)
fun main(args: Array<String>) {
build {
"test1" to 10
"test2" to "name"
"test3"(50)
}
}
0
Выглядит круто! Только что-то у меня не вызываются в Вашем примере ни invoke, ни to :( Хотя, наверняка, это я где-то что-то упустил.
0
В вашем примере блок
В «пустоту» уйдет…
"test1" to 10
"test2" to "name"
"test3"(50)
В «пустоту» уйдет…
0
это же пример, просто, если не понятно, то вот полноценный рабочий пример:
class Struct(val fields: Map<String, Any>)
class StructBuilder {
private val fields = HashMap<String, Any>()
infix fun <T : Any> String.to(value: T) {
fields[this] = value
}
operator fun <T : Any> String.invoke(value: T) {
fields[this] = value
}
fun build(): Struct = Struct(fields)
}
fun build(builder: StructBuilder.() -> Unit): Struct =
StructBuilder().apply(builder).build()
fun main(args: Array<String>) {
val struct = build {
"test1" to 10
"test2" to "name"
"test3"(50)
}
}
0
Ага, спасибо! В первом примере просто пропущено слово «infix» у оператора «to», я не сразу заметил. В общем, покапитаню и скажу, что определяя оператор «to» внутри класса Struct мы получаем доступ и к объекту Struct и к строке перед оператором и ко второму параметру, следующему после оператора «to» и в этом сам фокус. С «invoke» та же история.
0
Но лучше не надо (какой-то оверинжиниринг)
0
Народ, помогите перевести документацию по котлину на русский! Или хотя бы поискать ошибки в тексте. Уже много сделано, но хочется больше. Спасибо.
0
Вот меня это удивляет: разработчики языка, на сколько я понимаю — наши. А вот ни документации на русском ни книг. Нету :(
Понятно, что всё это бизнес, и английский де факто — стандарт. Но даже не заметно телодвижений в этом направлении.
Понятно, что всё это бизнес, и английский де факто — стандарт. Но даже не заметно телодвижений в этом направлении.
+2
А как присоединиться к помогающим?
Ни кнопки «Помочь», ни кнопки «войти»/«зарегистрироваться» нет
Ни кнопки «Помочь», ни кнопки «войти»/«зарегистрироваться» нет
+1
слева в оглавлении внизу раздел "Редактору" — там написано как редактировать
+1
Помогать очень просто — все тексты хостятся на GitHub. Можно переводить файлы, добавлять новые, в том числе редактировать меню. Там же можно создавать Issue по поводу ошибок в тексте или предложений функциональности / дизайна сайта.
По умолчанию вы можете делать Pull Request а мы его быстро проверяем, одобряем.
Или обратитесь в группу в Телеграм за доступом на запись, чтобы пушить в напрямую без задержки на проверку.
Спасибо!
По умолчанию вы можете делать Pull Request а мы его быстро проверяем, одобряем.
Или обратитесь в группу в Телеграм за доступом на запись, чтобы пушить в напрямую без задержки на проверку.
Спасибо!
0
Раз уж заговорили про способы написать собственные DSL, стоит посмотреть на JetBrains MPS.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем простой DSL на Kotlin в 2 шага