Size: a a a

Saint P Ruby Community

2020 March 17

IM

Igor Morozov in Saint P Ruby Community
тебя ж никто не заставляет
источник

IM

Igor Morozov in Saint P Ruby Community
ханами-апи или рода для роутов, ром для персистенса и у тебя рельса без этого всего. кайф же
источник

w

wi11son in Saint P Ruby Community
Хотите немного черной магии?
источник

w

wi11son in Saint P Ruby Community
ой, не то
источник

w

wi11son in Saint P Ruby Community
источник

IM

Igor Morozov in Saint P Ruby Community
ничего себе у вас хаты дешевые
источник

w

wi11son in Saint P Ruby Community
ruby
class SynchronizedAccess < Module
 def initialize(mutex)
   @mutex= mutex

   module_eval(<<~RUBY)
     def initialize(*)
       #{mutex} = Mutex.new
       super
     end
   RUBY
 end

 def prepended(base)
   mod = self

   base.singleton_class.send(:define_method, :synchronized) do |m|
     mod.synchronized(m)
   end
 end

 def synchronized(method_name)
   module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
     def #{method_name}(*)
       #{@mutex}.synchronize { super }
     end
   RUBY
 end
end


class Foo
 prepend SynchronizedAccess.new(:@_mutex)

 synchronized def foo
   puts "it's safe here"
 end
end
источник

w

wi11son in Saint P Ruby Community
вот я почти это понимаю
источник

АД

Антон Дьячук in Saint P Ruby Community
wi11son
ruby
class SynchronizedAccess < Module
 def initialize(mutex)
   @mutex= mutex

   module_eval(<<~RUBY)
     def initialize(*)
       #{mutex} = Mutex.new
       super
     end
   RUBY
 end

 def prepended(base)
   mod = self

   base.singleton_class.send(:define_method, :synchronized) do |m|
     mod.synchronized(m)
   end
 end

 def synchronized(method_name)
   module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
     def #{method_name}(*)
       #{@mutex}.synchronize { super }
     end
   RUBY
 end
end


class Foo
 prepend SynchronizedAccess.new(:@_mutex)

 synchronized def foo
   puts "it's safe here"
 end
end
и зачем это на ночь?
источник

NS

Nikita Shilnikov in Saint P Ruby Community
wi11son
ruby
class SynchronizedAccess < Module
 def initialize(mutex)
   @mutex= mutex

   module_eval(<<~RUBY)
     def initialize(*)
       #{mutex} = Mutex.new
       super
     end
   RUBY
 end

 def prepended(base)
   mod = self

   base.singleton_class.send(:define_method, :synchronized) do |m|
     mod.synchronized(m)
   end
 end

 def synchronized(method_name)
   module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
     def #{method_name}(*)
       #{@mutex}.synchronize { super }
     end
   RUBY
 end
end


class Foo
 prepend SynchronizedAccess.new(:@_mutex)

 synchronized def foo
   puts "it's safe here"
 end
end
я начал не с этого, но немного увлекся
источник

АД

Антон Дьячук in Saint P Ruby Community
жостко очень, кошмары опять будут
источник

АД

Антон Дьячук in Saint P Ruby Community
спасибо, блин, большое :)
источник

EM

Eugene Maslenkov in Saint P Ruby Community
Ну за то теперь даже если ночью разбудят, сможем рассказать, как сделать dsl оборачивающий методы в mutex :)
источник

AD

Anton Davydov in Saint P Ruby Community
wi11son
вот я почти это понимаю
Вроде примерно так же memo def method в топтале работает
источник

AD

Anton Davydov in Saint P Ruby Community
wi11son
ruby
class SynchronizedAccess < Module
 def initialize(mutex)
   @mutex= mutex

   module_eval(<<~RUBY)
     def initialize(*)
       #{mutex} = Mutex.new
       super
     end
   RUBY
 end

 def prepended(base)
   mod = self

   base.singleton_class.send(:define_method, :synchronized) do |m|
     mod.synchronized(m)
   end
 end

 def synchronized(method_name)
   module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
     def #{method_name}(*)
       #{@mutex}.synchronize { super }
     end
   RUBY
 end
end


class Foo
 prepend SynchronizedAccess.new(:@_mutex)

 synchronized def foo
   puts "it's safe here"
 end
end
Вообще, мне понравился код
источник

AD

Anton Davydov in Saint P Ruby Community
Nikita Shilnikov
я начал не с этого, но немного увлекся
Красиво сделал, кек
источник

EM

Eugene Maslenkov in Saint P Ruby Community
+
источник
2020 March 18

MM

Marsel Mustafin in Saint P Ruby Community
Anton Davydov
кстати, я тут вспомнил, что у меня есть текст в котором я про историю появления вима писал и что и как там работает. может кому интересно будет

https://www.davydovanton.com/2014/03/16/vim-history/
класс, спасибо, доступное объяснение идей вима
источник

m

max in Saint P Ruby Community
wi11son
ruby
class SynchronizedAccess < Module
 def initialize(mutex)
   @mutex= mutex

   module_eval(<<~RUBY)
     def initialize(*)
       #{mutex} = Mutex.new
       super
     end
   RUBY
 end

 def prepended(base)
   mod = self

   base.singleton_class.send(:define_method, :synchronized) do |m|
     mod.synchronized(m)
   end
 end

 def synchronized(method_name)
   module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
     def #{method_name}(*)
       #{@mutex}.synchronize { super }
     end
   RUBY
 end
end


class Foo
 prepend SynchronizedAccess.new(:@_mutex)

 synchronized def foo
   puts "it's safe here"
 end
end
тут забыто пару super() и mutex "протекает" в класс
вот вариант почище
успехов поломать голову в дебагере =)
class SynchronizedAccess < ::Module
 def initialize
   __mutex__= nil

   super

   define_method(:initialize) do |*args|
     __mutex__ = Mutex.new

     super(*args)
   end

   # like `def self.synchronized` but as closure with __mutex__
   # defines instance methods on our instance module
   # calls original method wrapped in mutex
   singleton_class.define_method(:synchronized) do |method_name|
     define_method(method_name) do |*args|
       __mutex__.synchronize do
         super(*args)
       end
     end
   end
 end

 # to be included in class
 # to make class method `Foo.synchronized` available
 # as a closure around our instance of SynchronizedAccess
 class ClassMethods < ::Module
   def initialize(mod)
     __mod__ = mod

     super()

     define_method(:synchronized) do |method_name|
       __mod__.synchronized(method_name)
     end
   end
 end

 # @note dont like `base.singleton_class.define_method` as it defines method on Foo.singleton_class
 def prepended(base)
   base.extend ClassMethods.new(self)

   super
 end
end


class Foo
 prepend SynchronizedAccess.new

 synchronized def foo
   puts "it's safe here"
 end
end
источник

NS

Nikita Shilnikov in Saint P Ruby Community
Че-то ты не понял, что мьютекс на инстанс делается, все остальное вкусовщина
источник