Pull to refresh
5
0
Марк @Nihiroz

Android разработчик

Send message

В котлине можно написать маленький экстеншен


operator fun <T> ((T) -> Unit).plus(
    other: (T) -> Unit
): (T) -> Unit = { param ->
    this(param)
    other(param)
}

И складывать лямбды по всему проекту

Котлин все таки не скриптовый язык, поэтому такой проблемы нет. А если хочется написать в одну строку, то можно оставить одну точку с запятой: val p1 = Point(); val p2 = Point(1, 2)

А в чем практическое различие? В котлине лямбды и ссылки на методы взаимозаменяемые:


Лямбда и ссылка на метод
class Greeter(
    private val name: String  
) {

    fun greet(printer: (String) -> Unit) =
        printer("Hello $name!!!")

}

object Writer {

    fun write(message: String) = print(message) 

}

val greeter = Greeter("World")
greeter.greet { message -> print(message) } //Лямбда
greeter.greet(Writer::write) //Ссылка на функцию

В котлине подобное можно сделать через корутины и Flow. А с помощью перегрузки операторов можно даже и синтаксис += использовать


Код
operator fun <T> Flow<T>.plusAssign(collector: suspend (T) -> Unit) {
    GlobalScope.launch { collect(collector) }
}

val onClickEvent = MutableSharedFlow<Unit>()
onClickEvent += { println("onClick") }
onClickEvent.tryEmit(Unit)

Ну разве код onClickEvent += { println("onClick") } не более выразительный, чем делегаты?

В котлине не длиннее:


val p1 = Point()
val p2 = Point(1, 2)

Даже короче, за счет отсутствия точки с запятой

Это ведь просто лямбды. В котлине ведь это другое. В котлине делегат это способ вынести логику свойства объекта в отдельный класс.


Вот два идентичных кода
class WithoutDelegate {

    private var stringValue = "0"

    var value: Int
        get() = stringValue.toInt()
        set(value) {
            stringValue = value.toString()
        }

}

class WithDelegate {

    var value: Int by object: ReadWriteProperty<Any?, Int> {

        private var stringValue = "0"

        override fun getValue(thisRef: Any?, property: KProperty<*>) =
            stringValue.toInt()

        override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
            stringValue = value.toString()
        }

    }

}

В данном конкретном случае код с делегатом получился запутанней и длиннее. Но он позволяет удобно разносить логику по классам

Подскажите пожалуйста, как это можно загуглить?

Я активно занимаюсь разработкой на Kotlin, а на C# писал только в универе, когда заставляли использовать именно этот язык. Есть ли что-то подобное котлиновским делегатам в C#?


Пример из котлина
fun main() {
    val remoteSource = RemoteSourceImpl()
    remoteSource.name = "NameStub"
    println("Address: ${remoteSource.address}")
}

interface RemoteSource {

    fun get(key: String): String

    fun set(key: String, value: String)

}

class RemoteValue(
    private val key: String
) : ReadWriteProperty<RemoteSource, String> {

    override fun getValue(thisRef: RemoteSource, property: KProperty<*>) =
        thisRef.get(key)

    override fun setValue(thisRef: RemoteSource, property: KProperty<*>, value: String) =
        thisRef.set(key, value)

}

class RemoteSourceImpl : RemoteSource {

    var name by RemoteValue("name")
    var address by RemoteValue("address")

    override fun get(key: String) =
        "Value for key $key from remote destination"

    override fun set(key: String, value: String) {
        //Saving value $value for key $key
    }

}
Зато так синтаксис проверит компилятор. И вероятность, что ошибка обнаружится при компиляции, а не в продакшене выше.
А мне понравились алгоритмические задачки в яндексе. Первым делом в голову приходит простой алгоритм с большой сложностью. А потом при помощи подсказок собеседующего и всяких хитростей он доводится до сложного, но с малой сложностью. Но у меня, конечно, таких задачек было штуки 4 на двух собеседованиях. На остальных проверяли уже не алгоритмы.
Хожу за водой в уличный автоматизированный киоск. Набираю там несколько пятилитровок, киоск наливает 5 литров и ждет смены бутылки. Иногда, если очень быстро сменить заполненную бутылку на пустую, то он не успевает это заметить и ждет, когда я поменяю бутылку. Приходится пустую бутылку доставать и снова ставить.
В статье не описано отношение других коллег к Л. Если он был так плох, то общее отношение к нему команды сделало бы свое дело. А если им был недоволен только автор, то, возможно, дело в авторе.

Для слоеного теста актуально

А мне больше зашел ZenCAD. Главным образом потому, что используется полноценный язык программирования Python

Тут нельзя сказать наверняка, что будет выгоднее, без конкретики, т.к. использование директ экструдера уменьшает длину необходимого отката, что уменьшает его время, что положительна сказывается на общем времени печатании модели. Дмитрий Соркин, для последнего медведя рекомендует директ экструдер. https://youtu.be/thyWvSqfDgw

Могу рассказать свою историю. Полтора года назад купил FlyingBear Ghost 4. За ~20000 рублей, это получается примерно 260 долларов. На этот принтер обзор не делал только ленивый.
В качестве необходимой доработки напечатал новое сопло для обдува детали при печати (В нынешней версии принтера FlyingBear Ghost 5 обдув хороший из коробки). И несколько месяцев заменил драйвера осей X и Y на тихие (старые драйвера сгорели после залития принтера водой). Это исправило незначительный дефект печати (в простонародье называемый "лососевая кожа") и сильно снизило шум при печати. Впрочем для меня это все было не критично.
Большинство доработок принтера у пользователей как раз связано с повышением скорости печати (на маленькой скорости почти все принтеры печатают хорошо). Для этого печатают натяжители ремней и переносят подающий пластик двигатель на печатающую головку.


Скорость в ущерб качеству можно увеличить следующими способами:


  • увеличить ускорения и рывки
  • Увеличить сопло (например 0.6мм, 0.8мм или даже 1мм)
  • Увеличить толщину слоя со стандартных 0.2мм до 0.6мм (Но нужно помнить, что толщина слоя должна быть в пределах от 0.25*D до 0.75D, где D это диаметр сопла)
  • Уменьшить количество линий в стенки модели
  • Уменьшить процент заполнения
    С помощью этих методов можно в десятки раз увеличить скорость печати. А при печати финальной модели можно и не торопиться.

Что печатал:


Елочки для подарков на Новый Год


Ваза


Корпус для лампы на адресных светодиодах


Контейнер для молока/кефира в холодильник


Формочка для печенек


Кормушка для рыб (не доделал)


Оболочка для домофонной таблетки


Мерная ложка


Корпус для переносного HDD


Разделялка белков и желтков


Корпус для паяльника


Корпус для усилителя


Баночки для рыбьего корма


Кувшин для поливки цветов

Мне кажется, что Kotlin стоит изучать в родной для него среде — IntelliJ IDEA

Information

Rating
Does not participate
Location
Пермь, Пермский край, Россия
Date of birth
Registered
Activity