gpt4 book ai didi

用于可扩展处理程序/插件架构的 Ruby 结构

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:40 24 4
gpt4 key购买 nike

我写的东西有点像 Facebook 的共享链接预览。

我想通过为每个我想为其编写自定义解析器的新站点放入一个新文件,使其可以轻松扩展到新站点。我已经弄清楚了设计模式的基本思想,但没有足够的模块经验来确定细节。我相信在其他项目中有很多类似的例子。

结果应该是这样的:

> require 'link'
=> true
> Link.new('http://youtube.com/foo').preview
=> {:title => 'Xxx', :description => 'Yyy', :embed => '<zzz/>' }
> Link.new('http://stackoverflow.com/bar').preview
=> {:title => 'Xyz', :description => 'Zyx' }

代码应该是这样的:

#parsers/youtube.rb
module YoutubeParser
url_match /(youtube\.com)|(youtu.be)\//
def preview
get_stuff_using youtube_api
end
end

#parsers/stackoverflow.rb
module SOFParser
url_match /stachoverflow.com\//
def preview
get_stuff
end
end

#link.rb
class Link
def initialize(url)
extend self with the module that has matching regexp
end
end

最佳答案

# url_processor.rb
class UrlProcessor
# registers url handler for given pattern
def self.register_url pattern, &block
@patterns ||= {}
@patterns[pattern] = block
end

def self.process_url url
_, handler = @patterns.find{|p, _| url =~ p}
if handler
handler.call(url)
else
{}
end
end
end

# plugins/so_plugin.rb
class SOPlugin
UrlProcessor.register_url /stackoverflow\.com/ do |url|
{:title => 'foo', :description => 'bar'}
end
end

# plugins/youtube_plugin.rb
class YoutubePlugin
UrlProcessor.register_url /youtube\.com/ do |url|
{:title => 'baz', :description => 'boo'}
end
end

p UrlProcessor.process_url 'http://www.stackoverflow.com/1234'
#=>{:title=>"foo", :description=>"bar"}
p UrlProcessor.process_url 'http://www.youtube.com/1234'
#=>{:title=>"baz", :description=>"boo"}
p UrlProcessor.process_url 'http://www.foobar.com/1234'
#=>{}

您只需要要求插件目录中的每个.rb。

关于用于可扩展处理程序/插件架构的 Ruby 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com