标签: ruby

如何在Ruby中的命名空间中获取所有类名?

我有一个模块Foo,它是许多类的命名空间Foo::Bar,Foo::Baz依此类推.

有没有办法返回命名空间的所有类名Foo

ruby

49
推荐指数
4
解决办法
2万
查看次数

Ruby方法'to_sym'有什么作用?

to_sym方法有什么作用?它是干什么用的?

ruby methods

49
推荐指数
1
解决办法
3万
查看次数

我不明白ruby本地范围

在这个例子中,

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时我没有收到此错误?

ruby

49
推荐指数
2
解决办法
1万
查看次数

了解Ruby中的私有方法

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)

ruby access-specifier

49
推荐指数
3
解决办法
4万
查看次数

是否需要File.expand_path(...,__ FILE__)最佳做法?

require File.expand_path(..., __FILE__)项目中需要其他文件的最佳方法吗?

ruby require

49
推荐指数
2
解决办法
2万
查看次数

OpenSSL vs GPG用于加密异地备份?

考虑到在将存档推送到场外备份位置之前使用GPG和OpenSSL进行本地加密之间的选择,每种解决方案的优点和缺点是什么?

背景:我目前正在管理基于Ubuntu 14.04.1的服务器基础架构,并且在可用时应用所有当前补丁.

所有这些系统都是无头的,使用经过审查的预制和自动化工具自动构建,并通过基于Intel的统一硬件上的KVM在虚拟机中运行.

我们偏爱Ruby,但更倾向于"正确地做事".由于两者兼而有之,我们选择"备份"gem作为创建我们想要保留的数据的加密存档的手段,因为它将为使用Vagrant的开发人员创建相同的加密存档,无论其机制如何,它传播了.

所有软件和配置都通过Puppet进行管理,因此这两项决定都不会对"用户体验"或方便性产生任何影响.这两个选项都将创建相关脚本,以便从创建的任何备份中进行管理,验证或还原.

鉴于此,当用于此目的时,任一加密选项是否对另一个提供任何优势?

ruby encryption gnupg puppet ubuntu-14.04

49
推荐指数
1
解决办法
2万
查看次数

after_commit属性

我在我的应用程序中使用了after_commit.

我希望它只在我的模型中更新特定字段时触发.谁知道怎么做?

ruby ruby-on-rails

48
推荐指数
6
解决办法
2万
查看次数

在Rails中,如何向String类添加新方法?

我想在我的Rails项目中为不同的对象构建一个索引,并希望添加一个'count_occurences'方法,我可以在String对象上调用它.

我看到我可以做类似的事情

class String
  def self.count_occurences
    do_something_here
  end
end
Run Code Online (Sandbox Code Playgroud)

定义此方法的确切方法是什么,以及将代码放在我的Rails项目中的位置?

谢谢

ruby monkeypatching ruby-on-rails-3

48
推荐指数
3
解决办法
3万
查看次数

如何合并Ruby哈希

如何合并这两个哈希:

{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud)

要得到:

{:car => {:color => "red", :speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud)

ruby hashmap

48
推荐指数
3
解决办法
5万
查看次数

Ruby语法:从'each ... do ..'块中突破

我正在开发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代码中突破?

ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

48
推荐指数
2
解决办法
8万
查看次数