遍历不同 类 中的变量以匹配 Ruby 中的字符串
Loop through variables in different classes to match string in Ruby
我有一个正在开发的 ruby (sinatra) 应用程序,我的输入是一个 url,无论是否冗长(真或假),所以基本上是这样的:
url 看起来像这样:例如 http://localhost:4567/git.company.com&v=false
。
获取这些的代码是这样的:
get '/:url' do |tool_url|
url = params[:url].to_s
is_verbose = params[:v].to_s
我将不同的 类 分隔在不同的文件中,我将它们包含在我的主脚本中,如下所示:
Dir["#{File.dirname(__FILE__)}/lib/*.rb"].each { |f| require(f) }
(样本文件应该是这样的),gitlab.rb
:
class Gitlab
$gitlab_token = 'TOKEN_GOES_HERE'
def initialize(url, v)
@@regex =~ /git.company.com/
@@gitlab_url = url
@@is_verbose = v
end
def check_gitlab(gitlab_url, is_verbose)
_gitlab_overall = '/health_check.json?token=#{gitlab_token}'
_gitlab_cache = '/health_check/cache.json?token=#{gitlab_token}'
_gitlab_database = '/health_check/database.json?token=#{gitlab_token}'
_gitlab_migrations = '/health_check/migrations.json?token=#{gitlab_token}'
unless is_verbose = true
CheckString.check_string_from_page('https://' + gitlab_url + gitlab_overall, 'success')
else
end
end
end
现在,我希望能够根据用户输入的 URL 动态知道使用哪个 "class" 来完成某项工作,所以我的想法是遍历那些类 寻找与输入匹配的特定变量。
我需要这方面的指导,因为我已经坚持了很长时间了;我已经尝试了很多我能想到的东西,但是 none 奏效了。
免责声明:请多多包涵,因为我是 Ruby 的新手,而且我对 OOP 语言不是很好(没有真正练习过)。
编辑:我愿意接受任何建议,比如如果有比这更好的不同逻辑,请告诉我。
做一个散列{ Regexp ⇒ Class }
:
HASH = {
/git.company.com/ => Gitlab,
/github.com/ => Github
}
然后做:
handler = HASH.detect { |k, _| k =~ url }.last.new
以上将为您提供您想要的 class 实例。
旁注:
is_verbose = params[:v].to_s
总是导致 is_verbose
设置为 truthy
值,检查 params[:v].to_s == "true"
is_verbose = true
是一个赋值,你只想使用 unless is_verbose
.
要使其运行时解析,强制插件 a) include Plugin
和 b) 声明 resolve
方法。 Plugin
模块应该定义一个回调钩子:
module Plugin
def self.included(base)
Registry::HASH[-> { base.resolve }] = base
end
end
resolve
方法应该 return 一个正则表达式,这里的 lambda 是为了在解析阶段解决它:
class PluginImpl
include Plugin
def resolve
/git.company.com/
end
end
然后在需要的时候匹配:
handler = HASH.detect { |k, _| k.() =~ url }.last.new
另一种方法是在 included
回调中的 base
上使用 ObjectSpace
to detect classes, including the module, or declare the TracePoint
来提供直接映射,但这一切过于复杂。
我有一个正在开发的 ruby (sinatra) 应用程序,我的输入是一个 url,无论是否冗长(真或假),所以基本上是这样的:
url 看起来像这样:例如 http://localhost:4567/git.company.com&v=false
。
获取这些的代码是这样的:
get '/:url' do |tool_url|
url = params[:url].to_s
is_verbose = params[:v].to_s
我将不同的 类 分隔在不同的文件中,我将它们包含在我的主脚本中,如下所示:
Dir["#{File.dirname(__FILE__)}/lib/*.rb"].each { |f| require(f) }
(样本文件应该是这样的),gitlab.rb
:
class Gitlab
$gitlab_token = 'TOKEN_GOES_HERE'
def initialize(url, v)
@@regex =~ /git.company.com/
@@gitlab_url = url
@@is_verbose = v
end
def check_gitlab(gitlab_url, is_verbose)
_gitlab_overall = '/health_check.json?token=#{gitlab_token}'
_gitlab_cache = '/health_check/cache.json?token=#{gitlab_token}'
_gitlab_database = '/health_check/database.json?token=#{gitlab_token}'
_gitlab_migrations = '/health_check/migrations.json?token=#{gitlab_token}'
unless is_verbose = true
CheckString.check_string_from_page('https://' + gitlab_url + gitlab_overall, 'success')
else
end
end
end
现在,我希望能够根据用户输入的 URL 动态知道使用哪个 "class" 来完成某项工作,所以我的想法是遍历那些类 寻找与输入匹配的特定变量。
我需要这方面的指导,因为我已经坚持了很长时间了;我已经尝试了很多我能想到的东西,但是 none 奏效了。
免责声明:请多多包涵,因为我是 Ruby 的新手,而且我对 OOP 语言不是很好(没有真正练习过)。
编辑:我愿意接受任何建议,比如如果有比这更好的不同逻辑,请告诉我。
做一个散列{ Regexp ⇒ Class }
:
HASH = {
/git.company.com/ => Gitlab,
/github.com/ => Github
}
然后做:
handler = HASH.detect { |k, _| k =~ url }.last.new
以上将为您提供您想要的 class 实例。
旁注:
is_verbose = params[:v].to_s
总是导致is_verbose
设置为truthy
值,检查params[:v].to_s == "true"
is_verbose = true
是一个赋值,你只想使用unless is_verbose
.
要使其运行时解析,强制插件 a) include Plugin
和 b) 声明 resolve
方法。 Plugin
模块应该定义一个回调钩子:
module Plugin
def self.included(base)
Registry::HASH[-> { base.resolve }] = base
end
end
resolve
方法应该 return 一个正则表达式,这里的 lambda 是为了在解析阶段解决它:
class PluginImpl
include Plugin
def resolve
/git.company.com/
end
end
然后在需要的时候匹配:
handler = HASH.detect { |k, _| k.() =~ url }.last.new
另一种方法是在 included
回调中的 base
上使用 ObjectSpace
to detect classes, including the module, or declare the TracePoint
来提供直接映射,但这一切过于复杂。