我有一个模块Foo,它是许多类的命名空间Foo::Bar,Foo::Baz依此类推.
有没有办法返回命名空间的所有类名Foo?
在这个例子中,
def foo(x)
if(x > 5)
bar = 100
end
puts bar
end
Run Code Online (Sandbox Code Playgroud)
然后foo(6)输出:100和foo(3)什么都不输出.
但是,如果我将定义更改为
def foo(x)
if(x > 5)
bar = 100
end
puts bob
end
Run Code Online (Sandbox Code Playgroud)
我得到一个"未定义的局部变量或方法"错误.
所以我的问题是为什么当我调用foo(3)并且从未设置bar时我没有收到此错误?
class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
Run Code Online (Sandbox Code Playgroud)
这当然是行不通的,因为我们指定了Example(e)的显式接收器 - 实例,这是针对"私有规则"的.
但我无法理解,为什么人们不能在Ruby中做到这一点:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
Run Code Online (Sandbox Code Playgroud)
public_m方法定义(即self)中的当前对象是Foo的实例.那么为什么不允许呢?为了解决这个问题,我必须self.private_m改为公正private_m.但为什么这个不同,是不是selfFoo里面的一个例子public_m?谁是裸字private_m呼叫的接收者?不是self- 实际上你省略了什么,因为Ruby会为你做这件事(会在self上调用private_m)吗?
我希望我没有太多混淆,我对Ruby仍然很新鲜.
编辑:谢谢你的所有答案.把它们放在一起我能(最终)神交明显的(而不是一个人,谁从来没有见过的东西,比如Ruby那么明显):这self本身可以是显性和隐性的接收器,并且赚取差价.因此,有两条规则,如果你要调用一个私有方法:self必须是隐式接收器,以及自我必须是当前类的一个实例(Example在这种情况下-而且,只有当自己好像里面实例方法的定义,在此期间发生方法执行).如果我错了,请纠正我.
class Example
# self as an explicit receiver (will throw an error)
def explicit
self.some_private_method
end
# self as an …Run Code Online (Sandbox Code Playgroud) 是require File.expand_path(..., __FILE__)项目中需要其他文件的最佳方法吗?
考虑到在将存档推送到场外备份位置之前使用GPG和OpenSSL进行本地加密之间的选择,每种解决方案的优点和缺点是什么?
背景:我目前正在管理基于Ubuntu 14.04.1的服务器基础架构,并且在可用时应用所有当前补丁.
所有这些系统都是无头的,使用经过审查的预制和自动化工具自动构建,并通过基于Intel的统一硬件上的KVM在虚拟机中运行.
我们偏爱Ruby,但更倾向于"正确地做事".由于两者兼而有之,我们选择"备份"gem作为创建我们想要保留的数据的加密存档的手段,因为它将为使用Vagrant的开发人员创建相同的加密存档,无论其机制如何,它传播了.
所有软件和配置都通过Puppet进行管理,因此这两项决定都不会对"用户体验"或方便性产生任何影响.这两个选项都将创建相关脚本,以便从创建的任何备份中进行管理,验证或还原.
鉴于此,当用于此目的时,任一加密选项是否对另一个提供任何优势?
我在我的应用程序中使用了after_commit.
我希望它只在我的模型中更新特定字段时触发.谁知道怎么做?
我想在我的Rails项目中为不同的对象构建一个索引,并希望添加一个'count_occurences'方法,我可以在String对象上调用它.
我看到我可以做类似的事情
class String
def self.count_occurences
do_something_here
end
end
Run Code Online (Sandbox Code Playgroud)
定义此方法的确切方法是什么,以及将代码放在我的Rails项目中的位置?
谢谢
如何合并这两个哈希:
{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud)
要得到:
{:car => {:color => "red", :speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud) 我正在开发Ruby on Rails应用程序.我的问题更多是关于Ruby语法.
我有一个带有类方法的模型类self.check:
class Cars < ActiveRecord::Base
...
def self.check(name)
self.all.each do |car|
#if result is true, break out from the each block, and return the car how to...
result = SOME_CONDITION_MEET?(car) #not related with database
end
puts "outside the each block."
end
end
Run Code Online (Sandbox Code Playgroud)
我想停止/从跳出each块一次的result是真实的(这是打破eachif块car.name是一样的name参数一次),并返回car其导致真正的结果.如何在Ruby代码中突破?