遍历不同 类 中的变量以匹配 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 来提供直接映射,但这一切过于复杂。