@rubyschool

Страница 403 из 921
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
серьезно? ?

Fedor
12.10.2017
09:51:16
серьезно? ?
у меня в сайблайме есть плагин new_file

я жму 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
спасибо ребята)

Страница 403 из 921