clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
y.khmelevskii 2018-02-15T08:17:39.000354Z

подскажите, как можно деструктурировать часть аргументов функции в переменные, а остальное в общую переменную? то есть, в выражении ниже мне не нужно что бы в переменной props были ключи class, type, size, icon

(defn render
  [{:keys [class
           type
           size
           icon]}
    :as props}
...
все что я могу прибумать - это внутри функции сделать
(let [props (dissoc props :class :type :size :icon)]
...)
но это плохо, мне приходится дважды делать перечисление одного и того же

2018-02-15T08:29:26.000286Z

мне кажется нельзя так сделать

y.khmelevskii 2018-02-15T08:38:12.000098Z

прям жаль. это довольно частый кейс. агалог в js

const render = ({
    class,
    type,
    size,
    icon,
    ...props
}) => (
...
);

y.khmelevskii 2018-02-15T08:39:18.000357Z

наверное нужно какой-то макрос в таком случае написать

2018-02-15T09:42:52.000359Z

Я думаю в такой конструкции мало пользы. Обычно из мапы выбираешь только нужные тебе свойства. Поэтому вполне нормально выбрать деструктуризацией то, что нужно и передать мапу дальше, и там там тоже выбирать необходимые значения и т.д. по цепочке

y.khmelevskii 2018-02-15T10:20:07.000398Z

@roman01la у меня это очень частый кейс. Например, я делаю компонент [forms/input] у которого есть свойство icon, которое рисует иконку внутри инпута. так вот я не хочу перечислять все свойства которые могут зайти в нативный input (`on-change`, on-mouse-click, auto-focus и много других), я просто хочу сделать, например, следующее (это псевдокод):

(defn input [{:keys [icon]
              :rest props}]
  [:div
   [:img {:src icon}]
   [:input props]])
я понимаю, что я могу сделать :as props, но тогда в моем отрендеренном компоненте у инпута будет атрибут icon, который я там видеть не хочу. Этот кейс очень частый для всех элементов форм, например

2018-02-15T10:22:29.000471Z

Может быть. Но всегда рекомендуют, и я так делаю, явно пописывать поля для эелементов. Что бы не было таких казусов. В JS то же самое

2018-02-15T10:23:00.000041Z

Потом проще понять что туда приходит, не нужно дебажить

y.khmelevskii 2018-02-15T10:23:15.000361Z

это утверждение верно для компонентов более высокого уровня

2018-02-15T10:23:48.000451Z

Наоборот это как раз для DOM элементов

2018-02-15T10:24:24.000548Z

Вроде бы в доках реакта об этом есть немного

y.khmelevskii 2018-02-15T10:25:26.000068Z

ну если я создаю копнонент <Button /> люди которые будут его использовать подразумевают что он умеет все что и умеен нативный button, а мне просто приходится зайти в спецификацию button и перечислить все атрибуты которые у него есть, что бы ничего не пропустить. я в этом смысла не вижу

y.khmelevskii 2018-02-15T10:26:06.000304Z

для кастомных копонентов приложения я согласен, так лучше не делать

2018-02-15T10:26:39.000385Z

Это стандартная проблема explicit vs implicit :) Кому что

y.khmelevskii 2018-02-15T10:27:14.000051Z

🙂

akond 2018-02-15T12:11:44.000094Z

напиши макрос

akond 2018-02-15T12:21:20.000044Z

или FR в destructure протокол

misha 2018-02-15T12:35:35.000431Z

Функцию напиши, которая 1 мапу на 2 делит

misha 2018-02-15T12:46:47.000399Z

А вообще добавить в clojure.core/destructuring :rest или & было бы удобненько

akond 2018-02-15T12:47:05.000267Z

я о том же

akond 2018-02-15T12:47:36.000469Z

польза будет какая для общества

misha 2018-02-15T12:49:26.000360Z

Там 1 функция плотная на 90 строк, расширить можно только переписав, на сколько я вижу

akond 2018-02-15T12:50:28.000018Z

можно только кейс для pmap переделать

misha 2018-02-15T12:51:24.000379Z

40 строк, уже легче )

akond 2018-02-15T12:51:48.000349Z

так не нам же переделывать, а @y.khmelevskii

misha 2018-02-15T12:52:36.000198Z

Только рич скажет - деструктуризация - сильно хот, нечего туда ваши рога совать с выдуманными юзкейсами

akond 2018-02-15T12:53:04.000363Z

я ж и говорю, FR сделать и посмотреть что будет.

misha 2018-02-15T12:53:17.000075Z

Что такое FR

akond 2018-02-15T12:53:23.000026Z

feature request

misha 2018-02-15T12:53:28.000405Z

а

misha 2018-02-15T12:55:36.000030Z

Но упражнение интересное

y.khmelevskii 2018-02-15T13:50:14.000266Z

ну пока сделаю для себя макрос, и напишу в чатик #clojurescript. Там Нолен вроде очень активный, может прокомментирует

y.khmelevskii 2018-02-15T13:50:36.000395Z

FR я не осилю пока )))