请考虑以下ruby代码
test.rb:
begin
puts
thisFunctionDoesNotExist
x = 1+1
rescue Exception => e
p e
end
Run Code Online (Sandbox Code Playgroud)
出于调试目的,我希望救援块知道该文件的第4行发生了错误.这样做有干净的方法吗?
我已经在Ruby中编程了几个月了,我想知道什么时候使用常量而不是类变量,反之亦然.(我在Rails工作,考虑模型中的常量).
class Category
TYPES = %w(listing event business).freeze
end
Run Code Online (Sandbox Code Playgroud)
要么
class Category
@@types = %w(listing event business).freeze
cattr_reader :types
end
Run Code Online (Sandbox Code Playgroud)
是否存在一种优于另一种情况的情况?或者只是品味/风格问题?
[1, 1, 1, 2, 3].mode
=> 1
['cat', 'dog', 'snake', 'dog'].mode
=> dog
Run Code Online (Sandbox Code Playgroud) will_paginate gem在我的Oracle版本上被破坏了.paginate_by_sqlWillPaginate模块中的默认方法是在查询中插入额外的"AS"并使其失败.
代码本身很容易修复,但我不确定让Rails接受我的更改的最佳方法.
我不想更改gem本身的代码,因为这会使我的代码在其他机器上被破坏.
我尝试创建一个包含以下内容的lib/test.rb文件:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
Run Code Online (Sandbox Code Playgroud)
并要求它来自environment.rb,但它没有接受我的更改.我也尝试过来自controllers/application.rb,但是再次提到我的更改.
暂时,我通过覆盖特定模型本身的方法来使其工作,但这有点像黑客,并且意味着我不能在该项目中的任何其他模型上使用它.
我确信有一个简单的方法可以做到这一点,但我没有运气跟踪它使用谷歌.
在python中,模块不必具有 main函数,但通常的做法是使用以下习语:
def my_main_function():
... # some code
if __name__=="__main__": # program's entry point
my_main_function()
Run Code Online (Sandbox Code Playgroud)
我知道红宝石不具备有一个main方法要么,但有某种我应遵循最佳实践?我应该说出我的方法main或其他什么?
作为旁注,我在python中也看到了以下习语:
def my_main_function(args=[]):
... # some code
if __name__=="__main__": # program's entry point
import sys
sys.exit(my_main_function(sys.argv))
Run Code Online (Sandbox Code Playgroud) 我正在使用Capistrano运行远程任务.我的任务看起来像这样:
task :my_task do
run "my_command"
end
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果my_command退出状态!= 0,那么Capistrano认为它失败并退出.当退出状态不为0时,如何在退出时让capistrano继续运行?我已经改变my_command了my_command;echo它并且它有效,但感觉就像一个黑客.
处理一个小的Ruby脚本,该脚本可以访问Web并抓取各种服务.我有一个包含几个类的模块:
module Crawler
class Runner
class Options
class Engine
end
Run Code Online (Sandbox Code Playgroud)
我想在所有这些类中共享一个记录器.通常我只是将它放在模块中的常量中并像这样引用它:
Crawler::LOGGER.info("Hello, world")
Run Code Online (Sandbox Code Playgroud)
问题是,在我知道输出的位置之前,我无法创建我的记录器实例.您可以通过命令行启动爬网程序,此时您可以告诉它您要在开发中运行(日志输出转到STDOUT)或生产(日志输出转到文件,crawler.log):
crawler --environment=production
Run Code Online (Sandbox Code Playgroud)
我有一个类Options解析通过命令行传入的选项.只有在那时我才知道如何使用正确的输出位置实例化记录器.
所以,我的问题是:我如何/在哪里放置我的记录器对象,以便我的所有类都可以访问它?
我可以将我的记录器实例传递给new()我创建的每个类实例的每个调用,但我知道必须有一个更好的Rubyish方法来实现它.我正在想象与模块共享的一些奇怪的类变量class << self或其他魔法.:)
更多细节:Runner通过将命令行选项传递给Options类来启动所有内容,并获取具有几个实例变量的对象:
module Crawler
class Runner
def initialize(argv)
@options = Options.new(argv)
# feels like logger initialization should go here
# @options.log_output => STDOUT or string (log file name)
# @options.log_level => Logger::DEBUG or Logger::INFO
@engine = Engine.new()
end
def run
@engine.go
end
end
end
runner = Runner.new(ARGV)
runner.run
Run Code Online (Sandbox Code Playgroud)
我需要代码Engine …
假设我有这个带有出货ID的数组.
s = Shipment.find(:all, :select => "id")
[#<Shipment id: 1>, #<Shipment id: 2>, #<Shipment id: 3>, #<Shipment id: 4>, #<Shipment id: 5>]
Run Code Online (Sandbox Code Playgroud)
带有货件ID的发票数组
i = Invoice.find(:all, :select => "id, shipment_id")
[#<Invoice id: 98, shipment_id: 2>, #<Invoice id: 99, shipment_id: 3>]
Run Code Online (Sandbox Code Playgroud)
shipment_id.要创建发票,我点击新发票,然后有一个包含发货的选择菜单,所以我可以选择"我为哪个发货创建发票".所以我只想显示尚未为其创建发票的货件清单.
所以我需要一组没有发票的货件.在上面的例子中,答案是1,4,5.
我需要检查两个数组是否包含任何顺序的相同数据.使用虚构的compare方法,我想做:
arr1 = [1,2,3,5,4]
arr2 = [3,4,2,1,5]
arr3 = [3,4,2,1,5,5]
arr1.compare(arr2) #true
arr1.compare(arr3) #false
Run Code Online (Sandbox Code Playgroud)
我用过arr1.sort == arr2.sort,似乎有用,但是有更好的方法吗?
ruby ×10
arrays ×3
bash ×1
capistrano ×1
class-design ×1
comparison ×1
constants ×1
exception ×1
gem ×1
logging ×1
main-method ×1
php ×1