Size: a a a

Ruby, Rails, Hanami | dry-rb

2020 October 29

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Но вопрос зачем?
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Зачем? — для решения учебной задачи.
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Если это сеттер, то это метод класса?
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Имхо, но гавно эта твоя задача
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Приходится иметь дело с тем, что есть )
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Такой код ни разу никто не станет поддерживать и пропускать в прод
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
Michael Gurov
Доброй ночи.

Вопрос новичка, только разбираюсь с Ruby, не пинайте сильно. Есть такой пример использования класса SomeClass и функции run:
entity = SomeClass.new do
 param :p1
 functions do
   f_x1 ->(x) { x+1 }
   f_x2 ->(x) { x*2 }
 end
end

entity.run() # тут в run должно использоваться значение из param и вызываться функции из functions

Первая непонятка в синтаксисе. param :p1 понимаю как вызов метода; по логике это вроде как должен быть вызов метода param класса SomeClass, который сохраняет переданное ему значение для последующего использования. Но похоже, что из блока напрямую вызвать метод класса нельзя, без явного указания параметра '|...|' в блоке и без вызова yuild с (self). Вопрос: что это за конструкция param :p1 и как её использовать?

Аналогично с параметром functions: понимаю так, что это вложенный блок, содержащий именованные лямбды, но как их можно извлечь из переданного блока и использовать в run(), ума не приложу. Также не могу понять синтаксис: если бы было написано f_x1 = ->(x) { x+1 }, я бы понял, но в примере написано именно f_x1 ->(x) { x+1 }.  

Заранее спасибо за ответы.
есть ещё class_eval и instance_eval
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
и _exec
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Michael Gurov
Если это сеттер, то это метод класса?
Не обязательно
источник

CM

Cucumba Morozov in Ruby, Rails, Hanami | dry-rb
Cucumba Morozov
есть ещё class_eval и instance_eval
скорее всего, там примерно такое и происходит
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Vasyl Kuzmyk
Не обязательно
Ну по логике это должен быть метод класса, который устанавливает значение p1 для конкретного экземпляра класса . Что мне непонятно, так это как написать метод param класса SomeClass, чтобы он вызывался из переданного блока?
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Или по-другому спрошу, как обработать переданный блок, чтобы при его выполнении был вызван метод param класса SomeClass ?
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
def initialize(&block)
 instance_eval(block)
end
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
А если вызываешь методы класа, то class_eval
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Или просто yield
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
Vasyl Kuzmyk
Или просто yield
Через yield пытался сделать, не получается:
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
class SomeClass
 def initialize
   yield(self) if block_given?
 end
 def param(sel)
   @sel = sel
 end
 def run (str)
   puts @sel
   puts str
 end
end

pc = SomeClass.new do
 param :p1
end

pc.run('hello')
источник

MG

Michael Gurov in Ruby, Rails, Hanami | dry-rb
undefined method `param' for main:Object (NoMethodError)
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
У тебя через yield так и не выйдет
источник

VK

Vasyl Kuzmyk in Ruby, Rails, Hanami | dry-rb
Тебе тут нужен instance_eval
источник