Tag: 元编程

有没有更好的方法来获取Ruby对象的公共“属性”?

有没有更好的方法来获取Ruby对象的公共“属性”? def props self.public_methods.grep(/.=$/) – [“==”,”===”] end

Ruby MetaProgramming中令人困惑的案例

我是Ruby MetaProgramming的初学者。 在irb中练习我的代码时,我遇到了这个问题。 class A; end a = A.new b = class < works for b.foo b.instance_eval { define_method :bar do; puts ‘bar’; end } # => WHY this one works for a.bar rather than b.bar 最后一段代码片段让我困惑。 感谢您的具体答案,但也许我没有清楚地解释我的困惑。 我真正想要理解的是为什么define_method在这些情况下表现得如此不同,这里: class A def foo1 p ‘foo1 from A’ end define_method :bar1 do p ‘bar1 from A’ […]

从模块中访问包含类的命名空间

我正在研究一个模块,除其他外,它将为你混合它的类添加一些通用的’finder’类型function。 问题:出于方便和美观的原因,我想在类之外包含一些function,与类本身在同一范围内。 例如: class User include MyMagicMixin end # Should automagically enable: User.name(‘Bob’) # Returns first user named Bob Users.name(‘Bob’) # Returns ALL users named Bob User(5) # Returns the user with an ID of 5 Users # Returns all users 我可以在这些方法中做function,没问题。 案例1( User.name(‘Bob’) )很简单。 但是,案例2-4需要能够在User之外创建新的类和方法。 Module.included方法允许我访问该类,但不允许访问其包含的范围。 在Class和Module上没有简单的“父”类型方法。 (对于命名空间,我的意思是,不是超类,也不是嵌套模块。) 我能想到的最好方法是在类的#name上进行一些字符串解析,以打破其命名空间,然后将字符串转换回常量。 但这看起来很笨拙,鉴于这是Ruby,我觉得应该有更优雅的方式。 有没有人有想法? 或者我只是为了自己的利益而过于聪明?

如何使用Ruby的元编程来减少方法计数

我有一堆重复的方法,我相信我可以用某种方式使用Ruby的元编程。 我的class级看起来像这样: class SomePatterns def address_key “…” end def user_key “…” end def location_key “…” end def address_count redis.scard(“#{address_key}”) end def location_count redis.scard(“#{location_key}”) end def user_count redis.scard(“#{user_key}”) end end 我以为我只能有一种方法: def count(prefix) redis.scard(“#{prefix}_key”) # wrong, but something like this end 以上是错误的,但我说*_count方法将遵循一种模式。 我希望学会使用元编程来避免重复。 我怎么能这样做?

在Ruby中定义元编程的方法参数

在Ruby中,我们可以使用元编程定义实例方法,如: define_method(:hi) { ‘Hello, SO world!’ } # => :hi hi # => “Hello, SO world!” 这样,就可以使用动态名称定义方法: dynamic_name = :hi # => :hi define_method(dynamic_name) { ‘Hello, SO world!’ } # => :hi hi # => “Hello, SO world!” 我们还可以将参数注入动态方法: dynamic_name = :hi # => :hi define_method(dynamic_name) do |arg1, arg2, &block| ‘Hello, SO world!’ end # […]

在Ruby中定义一个新的逻辑运算符

这是一个空闲的白日梦,但是有可能通过一些巧妙的元编程技巧在Ruby中定义一个新的逻辑运算符吗? 我想定义一个but运算符。 例如,如果我想做一些事情,如果x但不是y是真的,我必须写如下: if x and not y 但我想写 if x but not y 它应该与完全相同and但是应该由程序员明智地使用以增加代码的易读性。

有没有办法在ruby中重新定义 = +

我正在尝试编写一个简单的DSL(针对Redis),我想定义[] + =我自己 我有 def []=(key,val) @redis.zadd(@name,val,key) end 我想定义 def []+=(key,val) @redis.zincrby(@name,val,key) end 但我的理解是Ruby提供了“[] + =”运算符自动赋予[] = 有没有办法克服这种行为显然我不想要这个,因为我不能,比方说,在管道模式下运行它

元编程多少太多了?

随着我越来越习惯使用元编程技术,我发现越来越多的元编程应用程序。 我现在正在开展一个小项目,我正在动态创建这些类的类和实例,我想知道我是否已经将元编程过度了? 是否存在过多的元编程? 如果是这样,人们在哪里画线?

Ruby String与正则表达式分开

这是Ruby 1.8.7但应该与1.9.x相同 我试图拆分一个字符串,例如: a = “foo.bar.size.split(‘.’).last” # trying to split into [“foo”, “bar”,”split(‘.’)”,”last”] 基本上在它代表的命令中拆分它,我试图用Regexp做但不确定如何,想法是使用regexp a.split(/[az\(\)](\.)[az\(\)]/) 这里尝试使用group (\.)来拆分它,但这似乎不是一个好方法。

我如何编写自己的loop_until?

我正在练习我的Ruby元编程并试图编写我自己的循环方法来处理监听套接字时的大部分丑陋,但是让程序员有机会指定循环中断条件和一系列事情要做每个IO.select/sleep循环。 我想要写的是这样的: x = 1 while_listening_until( x == 0 ) do x = rand(10) puts x end 我能够做的工作是: def while_listening_until( params, &block ) break_cond = params[ :condition ] || “false” loop { #other listening things are happening here yield break if params[:binding].eval( break_cond ) } end x = 1 while_listening_until( :condition => “x==0”, :binding => […]