Size: a a a

2020 December 14

VS

Vitaliy Smityukh in RubyRush
Stani
если правильно понял (спустя 7 минут), то вопрос следующий:
у конструктора класса в качестве параметра есть некий name, в конструктуре написано @name = name

и нужно выяснить задавался ли при создании экземпляра класса этот параметр, и если да, то является ли он строкой.


я правильно понял?
да, строкой или пустой или длина этого параметра должна быть больше 10 символов, условно (если мы ожидаем допустим адрес). Как это правильно завалидировать?
источник

S

Stani in RubyRush
Vitaliy Smityukh
еще раз, ты создаешь класс. В классе в конструкторе ты ожидаешь получить нейм. Далее ты инициализируешь экземпляр этого класса вызовом ClassName.new("") и передаешь туда пустую строку. Естественно, это не логично, мы ожидаем там увидеть реальный нейм и с ним далее работать (выводить его длину к примеру). У меня вопрос, как по феншую обычно валидируются эти вещи, они присекаются или нет? (ошибка, месседж какой-то мол ты неправильно передал атрибут класса и тд?)
так бы и писал с самого начала.
источник

DK

Dmitry Kischenko in RubyRush
class Order
 include Validator
 attr_accessor :name
 def initialize(name:)
   @name = name
    validate
 end

 private

 def validate
   validate_not_empty @name
 end
end

module Validator
 def validate_not_empty(*params)
   params.map { |param| raise EmptyStringError if param.empty? }
 end
end

class EmptyStringError < StandardError
 def initialize(msg = 'Please, pass not empty string')
   super
 end
end


возможно это не феншуй, но как вариант
источник

VS

Vitaliy Smityukh in RubyRush
Dmitry Kischenko
class Order
 include Validator
 attr_accessor :name
 def initialize(name:)
   @name = name
    validate
 end

 private

 def validate
   validate_not_empty @name
 end
end

module Validator
 def validate_not_empty(*params)
   params.map { |param| raise EmptyStringError if param.empty? }
 end
end

class EmptyStringError < StandardError
 def initialize(msg = 'Please, pass not empty string')
   super
 end
end


возможно это не феншуй, но как вариант
спасибо, я вот и думал через ерроры это обрабатывать или можно как-то по другому)
источник

V

Valery in RubyRush
111a
Имя класса это константа, классов без имени не бывает
В Ruby можно создать и использовать безымянный (анонимный класс), т.к. все классы в Ruby являются экземплярами сласса Class.
Но в отличие от экземпляров обычных классов, экземпляры класса Class могут иметь свои собственные экземпляры.

instance_of_anonymous_class =
 Class.new do
   def abc  # We can define an instance method of the anonymous class
     'abc'
   end
 end.new
 
# Let's figure out the class name
instance_of_anonymous_class.class.name  # => nil

# We can call instance methods of the anonymous class
instance_of_anonymous_class.abc  # => "abc"

# We can create another instance of the same anonymous class
another_instance = instance_of_anonymous_class.class.new
источник

1

111a in RubyRush
Valery
В Ruby можно создать и использовать безымянный (анонимный класс), т.к. все классы в Ruby являются экземплярами сласса Class.
Но в отличие от экземпляров обычных классов, экземпляры класса Class могут иметь свои собственные экземпляры.

instance_of_anonymous_class =
 Class.new do
   def abc  # We can define an instance method of the anonymous class
     'abc'
   end
 end.new
 
# Let's figure out the class name
instance_of_anonymous_class.class.name  # => nil

# We can call instance methods of the anonymous class
instance_of_anonymous_class.abc  # => "abc"

# We can create another instance of the same anonymous class
another_instance = instance_of_anonymous_class.class.new
спасибо, ещё не встречал
источник

1

111a in RubyRush
Valery
В Ruby можно создать и использовать безымянный (анонимный класс), т.к. все классы в Ruby являются экземплярами сласса Class.
Но в отличие от экземпляров обычных классов, экземпляры класса Class могут иметь свои собственные экземпляры.

instance_of_anonymous_class =
 Class.new do
   def abc  # We can define an instance method of the anonymous class
     'abc'
   end
 end.new
 
# Let's figure out the class name
instance_of_anonymous_class.class.name  # => nil

# We can call instance methods of the anonymous class
instance_of_anonymous_class.abc  # => "abc"

# We can create another instance of the same anonymous class
another_instance = instance_of_anonymous_class.class.new
Симдянов пишет что это нежелательная практика.
источник

1

111a in RubyRush
источник

V

Valery in RubyRush
111a
Симдянов пишет что это нежелательная практика.
Симдянов создаёт класс и присваивает ему имя hello_world.
Т.е. у него НЕ анонимный класс.

Я создаю анонимный класс, т.е. я не присваиваю созданному классу имя.
Я присваиваю экземпляр анонимного класса переменной instance_of_anonymous_class.
Обратите внимание - я вызываю метод .new на созданном анонимном классе.

Т.е. я не нарушаю рекомендацию Симдянова. Я показываю, что в Ruby можно создать и использовать анонимный класс и его экземпляры. И только.
источник

1

111a in RubyRush
Valery
Симдянов создаёт класс и присваивает ему имя hello_world.
Т.е. у него НЕ анонимный класс.

Я создаю анонимный класс, т.е. я не присваиваю созданному классу имя.
Я присваиваю экземпляр анонимного класса переменной instance_of_anonymous_class.
Обратите внимание - я вызываю метод .new на созданном анонимном классе.

Т.е. я не нарушаю рекомендацию Симдянова. Я показываю, что в Ruby можно создать и использовать анонимный класс и его экземпляры. И только.
Спасибо, предстоит это всё осмыслить)
источник
2020 December 15

V

Valery in RubyRush
111a
Спасибо, предстоит это всё осмыслить)
Я немного ошибся.
Симдянов тоже создаёт анонимный класс и присваивает его локальной переменной hello_world.
Это именно анонимный класс (класс без имени) и вот как это можно увидеть:

hello_world =
 Class.new do
   def say
     'hello'
   end
 end
 
hello_world.name  # => nil

А теперь немножко изменим код - присвоим ссылку на анонимный класс константе и посмотрим в какой момент анонимный класс перестаёт быть анонимным и получает имя HelloWorld:

HelloWorld =
 Class.new do
   def say
     'hello'
   end
 end.tap { |cl| p cl.name }    # => nil
 
HelloWorld.name  # => "HelloWorld"

Здесь видно, что если ссылка на класс присваивается константе (начинается с большой буквы), то Ruby сразу после присвоения константе ссылки на анонимный класс сообщает ему его имя HelloWorld.
источник

E

Eugene in RubyRush
Valery
Я немного ошибся.
Симдянов тоже создаёт анонимный класс и присваивает его локальной переменной hello_world.
Это именно анонимный класс (класс без имени) и вот как это можно увидеть:

hello_world =
 Class.new do
   def say
     'hello'
   end
 end
 
hello_world.name  # => nil

А теперь немножко изменим код - присвоим ссылку на анонимный класс константе и посмотрим в какой момент анонимный класс перестаёт быть анонимным и получает имя HelloWorld:

HelloWorld =
 Class.new do
   def say
     'hello'
   end
 end.tap { |cl| p cl.name }    # => nil
 
HelloWorld.name  # => "HelloWorld"

Здесь видно, что если ссылка на класс присваивается константе (начинается с большой буквы), то Ruby сразу после присвоения константе ссылки на анонимный класс сообщает ему его имя HelloWorld.
Забавно. Как присвоение имени функции в JS
источник

E

Eugene in RubyRush
> x = function(){}
[Function: x]
> x.name
'x'
источник

o

omnia_101 in RubyRush
Добрый вечер, у меня есть такой массив
[[117501, "22", "2020-12-10"], [117501, "22", "2020-12-15"], [507, "22", "2020-12-15"]]

как его превратить в нечто такое
{117501=>[["22", "2020-12-15"], ["22", "2020-12-10"]], 507=>["22", "2020-12-15"]}
источник

SR

Shattered Ruby in RubyRush
omnia_101
Добрый вечер, у меня есть такой массив
[[117501, "22", "2020-12-10"], [117501, "22", "2020-12-15"], [507, "22", "2020-12-15"]]

как его превратить в нечто такое
{117501=>[["22", "2020-12-15"], ["22", "2020-12-10"]], 507=>["22", "2020-12-15"]}
Он повторяющиеся элементы не дублирует?
источник

SR

Shattered Ruby in RubyRush
А, да, не заметил сразу, что там вложенные массивы
источник

o

omnia_101 in RubyRush
пробовал нечто такое
group_by(&:itself).each_with_object({}) { |(k,v), hash| hash[k[0]] = ([k[1], k[2]]) }
но он переопределяет старое значение новым
 => {117501=>["22", "2020-12-15"], 507=>["22", "2020-12-15"]}
источник

Э

Эдем in RubyRush
group_by(&:first).map { |k, v| [k, v.map { |a| a[1..-1] }] }.to_h
источник

Э

Эдем in RubyRush
Неоптимальное решение, думаю. Если что-нибудь поковырять с reduce, лучше должно быть
источник

o

omnia_101 in RubyRush
Эдем
group_by(&:first).map { |k, v| [k, v.map { |a| a[1..-1] }] }.to_h
Спасибо за помощь, попробую поковырять reduce
источник