Pull to refresh

Comments 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)
    }
    
}
Выглядит круто! Только что-то у меня не вызываются в Вашем примере ни invoke, ни to :( Хотя, наверняка, это я где-то что-то упустил.
это же пример, просто, если не понятно, то вот полноценный рабочий пример:
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)
    }

}
Ага, спасибо! В первом примере просто пропущено слово «infix» у оператора «to», я не сразу заметил. В общем, покапитаню и скажу, что определяя оператор «to» внутри класса Struct мы получаем доступ и к объекту Struct и к строке перед оператором и ко второму параметру, следующему после оператора «to» и в этом сам фокус. С «invoke» та же история.
да, прошу прощения, в первом примере infix пропустил

Но лучше не надо (какой-то оверинжиниринг)

а то, что в статье — надо и не оверинжениринг?
Вот меня это удивляет: разработчики языка, на сколько я понимаю — наши. А вот ни документации на русском ни книг. Нету :(
Понятно, что всё это бизнес, и английский де факто — стандарт. Но даже не заметно телодвижений в этом направлении.

А меня нисколько не удивляет. Поддерживать документацию на нескольких языках это тысячи работы… И да, английский в разработке стандарт, всё равно без него никуда.

А как присоединиться к помогающим?
Ни кнопки «Помочь», ни кнопки «войти»/«зарегистрироваться» нет

слева в оглавлении внизу раздел "Редактору" — там написано как редактировать

Помогать очень просто — все тексты хостятся на GitHub. Можно переводить файлы, добавлять новые, в том числе редактировать меню. Там же можно создавать Issue по поводу ошибок в тексте или предложений функциональности / дизайна сайта.

По умолчанию вы можете делать Pull Request а мы его быстро проверяем, одобряем.
Или обратитесь в группу в Телеграм за доступом на запись, чтобы пушить в напрямую без задержки на проверку.

Спасибо!
Раз уж заговорили про способы написать собственные DSL, стоит посмотреть на JetBrains MPS.
Выглядит, что ключевое слово «простой». На MPS, по личным ощущениям, порог входа выше. А groovy и kotlin дают решение попроще, но не такое мощное
Sign up to leave a comment.