
Yuriy
12.10.2017
07:13:39
А нр, да, печки ещё те
Или нам с вами асеры с разных заводов приходят

Olga
12.10.2017
07:15:02
оба в России были куплены. В Ярославле и в Москве))
а поставщики действительно могут быть разные и сборщики тоже соотвественно

Александр
12.10.2017
07:26:39
были паккардбелл, асус, асер, dell, apple, понравился только макбук

Google

Vlad
12.10.2017
08:12:09
Ребят, нубский вопрос. Помогите с рекурсией, на входе процедуры ожидается множество значений, далее есть её рекурсивный вызов, передаю внутрь неё одну переменную из входящих аргументов, он все равно запаковывет её дополнительно в массив, как избежать этого?
https://pastebin.com/exNBSMEB
пример, на входе подам a=[1,2], b = [3,4], он зациклит первый массив, тк после входа в рекурсию уходит [1,2], а далее упаковывается в массив [[1,2]], each развернет мне первый уровень, и зацикливается

Fedor
12.10.2017
08:18:55
ничего не понял
что ты сделать то хочешь?

Александр
12.10.2017
08:19:18
+1

Fedor
12.10.2017
08:20:09
args.nil? or args.empty?
никогда не используй or, and и .т.д.
у них приоритет выполнения сильно меньше чем у || и &&
это может сильно порвать логику
ну и эта строка вполне заменяется на return if args.blank?

Vlad
12.10.2017
08:22:14
ну эт я еще не доработал этот кусок.
Суть, есть неизвестно сколько массивов, в них неизвестно сколько элементов, в которых могут быть еще массивы, в которых еще элементы, некоторые из них тоже массивы.
Перебрать все от и до

Fedor
12.10.2017
08:23:06
args.each do |element|
arr_to_hh(element)
end

Google

Fedor
12.10.2017
08:23:20
ну вот ты прошелся методом each по всем элементам и ничего не изменил )
у тебя метод рекурсивно так ходит и ничего не менят
вот и не понятно, что ты сделать то хочешь

Vlad
12.10.2017
08:23:57
в том то и дело, что я не прошелся по ним
у меня на входе в процедуру *args, когда я внутрь отсылаю [1,2], внутри процедуры заходит [[1,2]], и each раскрывает мне первые лишь скобки. Я убрал куски кода, что выполняют нужную мне обработку целенаправленно, чтобы меньше вам читать, остальное работает.
я смог объяснить проблему, или еще нет?

Fedor
12.10.2017
08:27:28
нет
вот в руби чатике кинули задачу - написать свой flatten для массива произвольной вложенности
я ее по быстрому решил ради интереса:
[12] pry(main)> def my_flatten(arr)
[12] pry(main)* arr.inject([]) do |res, elem|
[12] pry(main)* elem.is_a?(Array) ? res.concat(my_flatten(elem)) : res << elem
[12] pry(main)* end
[12] pry(main)* end
я делаю в методе inject - он меняет то, что в него передали и возвращает измененное значение
и за счет того, что оно изменено, меняется и вывод вшестоящего метода
а у тебя просто происходит чтение массива args и все

Vlad
12.10.2017
08:36:16
у тебя примерно та же суть, но что если я вызову её извне как
my_flatten([1,2], [3,4]), превышено кол-во аргументов. Поэтому я указал *args, но эта гадина, если внутрь идет лишь одно значение, пакует его тоже в массив

Fedor
12.10.2017
08:36:34
ну да
*args так и работает )
все что есть пакует в массив
можешь сделать для него flatten - будет просто массив всех аргументов без вложенности

Vlad
12.10.2017
08:37:42
костылем же пахнет, не?

Fedor
12.10.2017
08:37:57
это один из вариантов
другой - просто считать что тебе передали массив и работать с его элементами

Google

Fedor
12.10.2017
08:38:15
я не понимаю, чем тебя это не устраивает

Vlad
12.10.2017
08:40:14
но тогда на первом вызове со стороны надо будет вызывать как my_flatten([a,b,c]), вместо my_flatten(a,b,c), это не нравится, по факту
где a,b,c массивы

Fedor
12.10.2017
08:40:48
ну у меня функция принимает массив один работает с ним
можно добавить звездочку, тогда бюудет принимать множество элементов
завернет их в массив, и на первой же итерации развернет обратно
и все
разницы никакой

Vlad
12.10.2017
08:41:30
Да, я эт сразу понял, но тогда ведь у тебя будет проблема как у меня)

Fedor
12.10.2017
08:41:44
какая?

Vlad
12.10.2017
08:42:51
рекурсия упаковки и распаковки первого значения
в массив и из него, не?

Vlad
12.10.2017
08:43:02
пойду проверю
да, так и вышло. Добавил звезду, смотри вывод
def my_flatten(*arr)
p arr
arr.inject([]) do |res, elem|
elem.is_a?(Array) ? res.concat(my_flatten(elem)) : res « elem
end
end
my_flatten([1,2],[3,4])
Все таки придется прибегнуть к костылю видимо, единственное быстрое решение вижу на входе разворачивать массив, если он из одного элемента и этот элемент тоже массив. Хм, не красиво так

Fedor
12.10.2017
08:53:30
чет фигня какая-то
ааа, все понял

Vlad
12.10.2017
08:56:19
Да ну не, вроде все логично со стороны функционала руби, так и должно быть, раз * пакует в массив

Google

Fedor
12.10.2017
08:56:32
массив повторно заворачивается в массив и рекурсия зацикливается

Vlad
12.10.2017
08:56:38
Да да да да да
Бинго☺️

Fedor
12.10.2017
08:58:45
ну тогда да, либо разворачивать массив надо с проверкой
липо по другому костыльнуть

Vlad
12.10.2017
09:00:49
ну собственно, костыль все же, печально... Думал, вдруг как то можно избежать их.

Fedor
12.10.2017
09:00:50
[14] pry(main)> def test (arg1, *other)
[14] pry(main)* arg1 = other.present? ? other.unshift(arg1) : arg1
[14] pry(main)* puts arg1.inspect
[14] pry(main)* end
=> :test
[15] pry(main)> test(1)
1
=> nil
[16] pry(main)> test(1,2,3)
[1, 2, 3]
=> nil
смотри в чем идея, если передан только один аргумент, то мы возвращаем его
если больше одного, то мы считаем что это массив, и добавляем первый элемент в начало и имеем массив всех аргументов
иначе никак

Admin
ERROR: S client not available

Fedor
12.10.2017
09:01:48
руби не знает что ты ему скормил и что с этим делать

Vlad
12.10.2017
09:15:40
отходил, минуту вникнуть
что такое "present?", ругань на него идет
неизвестный метод массива

Fedor
12.10.2017
09:18:42
эм
может оно из рельсы )
а, ну да, из рельсы
оно обратно blankl?
можно заменить на проверку что оно не empty?

Google

Vlad
12.10.2017
09:20:45
который тоже из рельсы:)

Fedor
12.10.2017
09:21:27
https://ruby-doc.org/core-1.9.3/Array.html#method-i-empty-3F

Vlad
12.10.2017
09:21:43
не, это то я знаю, я про бланк

Olga
12.10.2017
09:47:34
обясните плиз)
я создаю модель, пишу: rails g model Contact email:string message:text
мне важно определять именно тут сразу все поля типа email, message. Я могу сделать это после создания модели уже в самом файле, разницы не будет?

Fedor
12.10.2017
09:48:12
да
эта шутка просто генерит файл
и я ей не пользуюсь вообще )

Olga
12.10.2017
09:49:01
ага т.е. могу писать в самом файле
Федор спасибо ?
а ты как создаешь модели ?))
наверно зря спросила))) боюсь неосилить твой ответ)))

Tanya
12.10.2017
09:50:07
правой кнопкой по папке видимо) создать файл. Contact.rb
и в него ручками дописываешь

Olga
12.10.2017
09:50:42
серьезно? ?

Vitaly
12.10.2017
09:50:49
перед тем, как ее применить

Fedor
12.10.2017
09:51:16
я жму ctrl+N и ввожу имя файла

Tanya
12.10.2017
09:51:40
О! я угадала как Федор делает)

Fedor
12.10.2017
09:51:52
потом он сразу открывается и я там пишу genmodel

Olga
12.10.2017
09:52:00
аа... ? вот оночо... все гениальное просто!

Fedor
12.10.2017
09:52:04
у меня на это написан снипет, который генерит пустую модел
а дальше уже сам заполняю

Olga
12.10.2017
09:52:47
спасибо ребята)