在Ruby中创建哈希哈希允许方便的两个(或更多)维度查找.但是,插入时必须始终检查散列中是否已存在第一个索引.例如:
h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)
最好在自动创建新哈希的情况下执行以下操作:
h = Hash.new
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)
类似地,当查找第一个索引尚不存在的值时,如果返回nil而不是接收"[]"错误的未定义方法,则更为可取.
looked_up_value = h['w']['z']
Run Code Online (Sandbox Code Playgroud)
可以创建一个具有此行为的Hash包装类,但是是否存在用于完成此任务的Ruby习惯用法?
我有一个相反的问题," 如何使Git忽略文件模式(chmod)更改? "我有一个文件,我已经更改了可执行权限,但也有一些文本更改,我想承诺前者但不承认后者.这可能与git有关吗?
(实际上,我做了一些文本更改,我想提交可执行权限更改,以及其他我不想提交)
更新:将文本更改取消暂存到文件,然后git add -p
再次执行并合并一些文本更改,以便将模式更改为暂存.(我的git版本是1.5.4.3)
有没有办法在ruby中使实例变量"私有"(C++或Java定义)?换句话说,我希望以下代码导致错误.
class Base
def initialize()
@x = 10
end
end
class Derived < Base
def x
@x = 20
end
end
d = Derived.new
Run Code Online (Sandbox Code Playgroud) 有许多方法可以进行调试,使用调试器就是其中之一,但对于谦虚,懒惰的程序员而言,简单的方法就是在代码中添加一堆打印语句.
即
def foo(x):
print 'Hey wow, we got to foo!', x
...
print 'foo is returning:', bar
return bar
Run Code Online (Sandbox Code Playgroud)
这种调试方式是否有正确的名称?
在Ruby中,如果字符串不在选项数组中,我将如何返回true?
# pseudo code
do_this if current_subdomain not_in ["www", "blog", "foo", "bar"]
Run Code Online (Sandbox Code Playgroud)
...或者你知道一个更好的方法吗?
如果我执行以下操作并在Ruby 1.9下打开警告:
$VERBOSE = true
x = 42
5.times{|x| puts x}
Run Code Online (Sandbox Code Playgroud)
我明白了
warning: shadowing outer local variable - x
Run Code Online (Sandbox Code Playgroud)
据推测,这与使用x作为块参数以及块外的变量有关,但"阴影"是什么意思?
我正在共享主机上托管一个git repo.我的repo必然有几个非常大的文件,每次我尝试在repo上运行"git gc"时,我的进程被共享主机提供程序杀死,因为使用了太多内存.有没有办法限制git gc可以消耗的内存量?我希望它可以交换内存使用速度,只需要花一点时间来完成它的工作.
--pre做什么gem install rails --pre?
每当我尝试扩展ruby模块时,我都会丢失模块方法.既不包含也不延伸都不会这样做.考虑一下片段:
module A
def self.say_hi
puts "hi"
end
end
module B
include A
end
B.say_hi #undefined_method
Run Code Online (Sandbox Code Playgroud)
无论B包括还是扩展A,都不会定义say_hi.
有没有办法完成这样的事情?
这很简单,我不敢相信它抓住了我.
def meth(id, options = "options", scope = "scope")
puts options
end
meth(1, scope = "meh")
-> "meh"
Run Code Online (Sandbox Code Playgroud)
我倾向于使用哈希作为参数选项,因为它是牧群的做法 - 它非常干净.我认为这是标准.今天,经过大约3个小时的寻找bug之后,我追踪到了一个错误,我碰巧正在使用这个假设命名参数将被尊重.他们不是.
所以,我的问题是:在Ruby(1.9.3)中,命名参数是否正式不受尊重,或者这是我缺少的一个副作用?如果他们不是,为什么不呢?