标签: ruby

在Ruby中使用辅助方法的首选方法是什么?

免责声明:虽然我在Rails应用程序的上下文中询问,但我不是在谈论Rails帮助程序(即查看帮助程序)

假设我有一个辅助方法/函数:

def dispatch_job(job = {})
  #Do something
end
Run Code Online (Sandbox Code Playgroud)

现在我想从几个不同的地方使用它(主要是控制器,还有一些BackgrounDRb工作者)

这样做的首选方法是什么?

我可以想到两种可能性:

1.使用类并使助手成为静态方法:

class MyHelper
  def self.dispatch_job(job = {})
  end
end

class MyWorker
  def run
    MyHelper.dispatch_job(...)
  end
end
Run Code Online (Sandbox Code Playgroud)

2.使用模块并将该方法包含在我需要此功能的任何类中

module MyHelper
  def self.dispatch_job(job = {})
  end
end

class MyWorker
  include MyHelper

  def run
    dispatch_job(...)
  end
end
Run Code Online (Sandbox Code Playgroud)

3.我还不知道的其他可能性

...
Run Code Online (Sandbox Code Playgroud)

第一个更像Java,但我不确定第二个是否真的适合使用Ruby的模块.

ruby

9
推荐指数
1
解决办法
6274
查看次数

在Ruby中,为什么在使用"do"和"end"时不能将方法调用视为一个单元?

以下问题与" Ruby Print Inject Do Syntax " 问题有关.我的问题是,我们能坚持使用do和end,使其与工作puts或p?

这有效:

a = [1,2,3,4]

b = a.inject do |sum, x|
  sum + x
end
puts b   # prints out 10
Run Code Online (Sandbox Code Playgroud)

所以,它是正确的,inject是Array对象的实例方法,并且此实例方法接受一段代码,然后返回一个数字.如果是这样,那么它应该与调用函数或方法并获取返回值没有什么不同:

b = foo(3)
puts b
Run Code Online (Sandbox Code Playgroud)

要么

b = circle.getRadius()
puts b
Run Code Online (Sandbox Code Playgroud)

在以上两种情况下,我们可以直接说

puts foo(3)
puts circle.getRadius()
Run Code Online (Sandbox Code Playgroud)

因此,使用以下两种方式无法直接使其工作:

a = [1,2,3,4]

puts a.inject do |sum, x|
  sum + x
end
Run Code Online (Sandbox Code Playgroud)

但它给了

ch01q2.rb:7:in `inject': no block given (LocalJumpError)
        from ch01q2.rb:4:in `each'
        from ch01q2.rb:4:in …
Run Code Online (Sandbox Code Playgroud)

ruby methods syntax function

9
推荐指数
2
解决办法
1513
查看次数

在RoR重新开课的地方

我正在尝试重新打开Stringrails中的类,并为我的应用程序添加更多方法.编写代码不是问题 - 我的问题是关于代码应该去哪里.

我在一个不同的模型文件中重新打开一个类是没有意义的,因为它实际上与任何模型没有任何关系.我想也许在某个地方config或者lib有意义,但我还不是特别熟悉RoR.

总而言之,定义类修改代码的最合理的位置在哪里,是否有任何影响,具体取决于代码加载的位置/时间?

ruby ruby-on-rails

9
推荐指数
2
解决办法
1346
查看次数

基于Ruby的DSL的好书

我正在尝试用红宝石创建一个DSL,你能给我一些好书吗?我环顾了亚马逊和野生动物园,但到目前为止找不到任何东西.

提前致谢!

ruby dsl

9
推荐指数
2
解决办法
3851
查看次数

喜欢-vim emacs ruby​​缩进

来自svn的ruby-mode,看起来等于1.1版本

这里是emacs的哈希缩进

User.all({
       :joins => :account,
       :conditions => {:delete_at => nil}
     })
Run Code Online (Sandbox Code Playgroud)

这在vim中是一样的

User.all({
  :joins => :account,
  :conditions => {:delete_at => nil}
})
Run Code Online (Sandbox Code Playgroud)

如何在ruby模式下使emac像vim一样缩进?

ruby vim emacs ruby-on-rails indentation

9
推荐指数
1
解决办法
1743
查看次数

需要Ruby中的前向声明

我试图在一个文件中编写一个Ruby脚本.

我想知道是否可以在开头编写"main"函数,具有main使用的其他函数,在它之后定义.换句话说,我想调用一个尚未定义的函数,这样它们就不依赖于定义顺序.只是更改顺序是不可能的,因为它给出了"未定义的方法"错误.在C/C++中我们使用前向声明...在Ruby中有类似的东西或其他解决方案吗?

ruby methods undefined

9
推荐指数
1
解决办法
2924
查看次数

你能在Ruby中定义<=>然后自动定义==,>,<,> =和<=吗?

这是我Note班级的一部分:

class Note
  attr_accessor :semitones, :letter, :accidental

  def initialize(semitones, letter, accidental = :n)
    @semitones, @letter, @accidental = semitones, letter, accidental
  end

  def <=>(other)
    @semitones <=> other.semitones
  end

  def ==(other)
    @semitones == other.semitones
  end

  def >(other)
    @semitones > other.semitones
  end

  def <(other)
    @semitones < other.semitones
  end
end
Run Code Online (Sandbox Code Playgroud)

在我看来,应该有一个我可以包含的模块,可以根据我的<=>方法给我我的相等和比较运算符.有吗?

我猜很多人遇到这种问题.你通常如何解决它?(你怎么让它干?)

ruby mixins spacecraft-operator

9
推荐指数
1
解决办法
199
查看次数

Ruby比较日期

我想做的是知道在过去10秒内是否在系统中创建了用户.所以我会这样做:

  def new_user
    if(DateTime.now - User.created_at < 10)
      return true
    else 
      return false 
    end
  end
Run Code Online (Sandbox Code Playgroud)

IT只是一个想法,我怎么能正确地做到这一点?谢谢

ruby ruby-on-rails date

9
推荐指数
1
解决办法
4935
查看次数

打开Java,Python,Ruby,Node.JS和PHP的支付网关库

我正在寻找支持许多不同支付处理器API的通用和开源支付库.换句话说,我想使用单一支付处理API开发应用程序,但能够轻松地在支付网关之间切换,例如Authorize.Net,Payflow Pro,Braintree,PayPal,Google,Amazon等.

这个问题提供了一些Java解决方案,但这些建议看起来都很糟糕.是不是还有像ActiveMerchant for Java的东西?我真的需要一个好的Java解决方案,以便在必要时构建我自己的解决方案.但如果它存在,我不想重新发明轮子.

有没有Python,Node.JS或PHP的解决方案?

理想情况下,我想找到类似于Ruby的ActiveMerchant的东西,它看起来非常完整.还有其他Ruby解决方案吗?

php ruby python java payment-gateway

9
推荐指数
1
解决办法
4943
查看次数

在Ruby或Python中可以重写Class的概念吗?

第一次堆栈溢出.

我正在研究使用Ruby或Python提供的一些元编程功能,但首先我需要知道它们允许我扩展语言的程度.我需要做的主要是重写Class的概念.这并不意味着我要重写一个特定的过程中运行时类,而是我要让我自己的一个什么概念类的.要想在这里变得更加具体,我想做一些像人们通常称之为课堂的东西,但我想要遵循一个" 开放的世界""假设.在正常类的"封闭世界"中,如果我声称Poodle是Dog的子类是Animal的子类,那么我知道Poodle也不会是一种FurCoat.但是,在开放世界类,然后我定义的Poodle对象可能是也可能不是FurCoat类型的对象,我们不会确切知道,直到我解释我可以穿长卷毛狗.(可怜的贵宾犬.)这一切都要做我正在做一项关于OWL本体的研究.

你知道,我试图在网上找到信息,但由于这里的条款超载,我没有发现任何有用的信息.

非常感谢,约翰

更新:我刚想到了一个很好的用例,用于我的开放世界的Class概念.也许这将更好地理解我真正想做的事情.我希望能够"描述"一个类而不是定义它.例如,我想能够说狗是a)有四条腿b)树皮的东西.然后我希望能够创建一个未指定Class的对象,并描述该对象有四条腿.此时,对象仍然是未指定的类型.然后我想说对象吠叫.此时,将知道该对象(可能除其他外)是狗.

ruby python metaprogramming class ontology

9
推荐指数
3
解决办法
520
查看次数