创建一个ruby类,在引用时返回一个字符串

时间:2013-06-25 09:45:57

标签: ruby-on-rails ruby

HTTParty的响应对象在引用时似乎返回#parsed_response。例如:

response = HTTParty.get(some_url)
response                 # => { some: 'random', stuff: 'in here' }
response.parsed_response # => { some: 'random', stuff: 'in here' }

另外,如果你检查response的类,它不是哈希值,而是响应对象

response.class # => HTTParty::Response

这很有用,因为您可以查看response上的其他内容,例如response.code,也可以非常方便地引用响应以获取parsed_response

我怎样才能在自己的课堂上做这样的事情?但是在引用类时我不想返回哈希,而是希望它返回一个字符串。

以下是我想要做的具体示例:

not_a_string = MyClass.new('hello', [1, 2, 3])
not_a_string        # => 'hello'
not_a_string.stuff  # => [1, 2, 3]

所以在rspec中,测试应该像这样通过:

not_a_string = MyClass.new('hello', [1, 2, 3])
not_a_string.should == 'hello'  # passes

3 个答案:

答案 0 :(得分:4)

这对你有用吗?

class MyClass < String
  attr_reader :stuff

  def initialize(string, stuff)
    super string
    @stuff = stuff
  end
end

它像这样工作

irb(main):002:0> t = MyClass.new('hello', [1, 2, 3])
=> "hello"
irb(main):003:0> t.stuff
=> [1, 2, 3]
irb(main):004:0> t.class
=> MyClass

- 编辑:改进的解决方案 -

这更清洁

class MyClass < Struct.new(:string, :stuff)
  def ==(other)
    string == other
  end

  def inspect
    string.inspect
  end
end

相同的输出:)

irb(main):002:0> t = MyClass.new('hello', [1, 2, 3])
=> "hello"
irb(main):003:0> t.stuff
=> [1, 2, 3]
irb(main):004:0> t.class
=> MyClass

答案 1 :(得分:1)

为了您的目的,定义inspect==

就足够了
class Test
  def initialize(string)
    @string = string.to_s
  end

  def inspect
    @string.inspect
  end

  def ==(other)
    @string == other
  end
end

t = Test.new 'asd' #=> "asd"
t #=> "asd"
t == 'asd' #=> true

答案 2 :(得分:0)

是的,这是一个很好的功能:) 您所要做的就是创建一个检查方法;)这里是一个例子:

class Greeter
  def initialize(name)
    @name = name.capitalize
  end

  def salute
    puts "Hello #{@name}!"
  end

  def inspect
    "hey"
  end
end


g = Greeter.new 'world'
g  # hey

干杯!