【问题标题】:uninitialized constant Ruby未初始化的常量 Ruby
【发布时间】:2014-05-13 20:54:59
【问题描述】:

我正在开发一个 ruby​​ 应用程序,该应用程序可以根据您的 IP 地址精确定位您的位置。虽然我遇到了路障。我已经在这个网站上搜索过了,但是我已经找到的解决方案太笼统了。

这是错误:

uninitialized constant Place::IpGeocoder (NameError)

还有我正在开发的代码:

require 'socket'
require 'geocoder'
require 'geokit'


class Place

  def get_location

  ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
  location = IpGeocoder.geocode(ip.to_s())
  end

end

me=Place.new
me.get_location

我已经安装了 gems。我是否需要在 java 中创建它的实例或类似的东西?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您需要按照文档Geokit::Geocoders::IpGeocoder 进行如下操作。

    Geokit::Geocoders::IpGeocoder.geocode(ip.to_s())
    

    IpGeocoder 类在模块Geokit::Geocoders 中定义。因此,要访问该类,您需要使用该类的完整路径,即Geokit::Geocoders::IpGeocoder,使用范围解析运算符::

    【讨论】:

    • 哦,好的,我现在明白了,所以如果我要对stackoverflow.com/questions/4889599/… 做类似的解决方案,那将是同样的事情。使用 include 和 MultiGeocoder
    • @CalvinJones 这意味着你需要给出完整的路径.. :)
    【解决方案2】:

    这称为命名空间。本质上,您所做的是尝试访问位于您的 Place 类中的 IpGeocoder 常量。除了你没有在那里定义一个常数。您必须通过给它一个方向来告诉 ruby​​ 在哪里找到 IpGeocoder 常量。 (澄清:在 ruby​​ 中类名是常量)

    类和方法在源代码中可能是这样声明的:

    module Geokit
      module Geocoders
        class IpGeocoder
        def geocode(ip)
        end
      end
    end
    

    正如您在此处看到的,要引用IpGeocoder 类中的方法,您需要告诉您的类如何使用它。 Arup 简洁地描述了这一点。

    【讨论】:

    • 好的,非常感谢您的澄清,现在我完全理解了这个概念,上帝保佑您,再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多