Tag: 对象

dup和clone都返回不同的对象,但修改它们会改变原始对象

我有一个值数组,当我打印哈希值时,我将其用作订单的参考。 我想修改数组,以便数组值“更漂亮”。 我想我只是复制或克隆数组,更改值,原始对象将保持未被控制。 但是(在irb中)…… @arr = [‘stuff’, ‘things’] a = @arr.clone b = @arr.dup 所以,至少,a和@arr是不同的对象: a.object_id == @arr.object_id => false 但现在它变得奇怪了 a[0].capitalize! a => [‘Stuff’, ‘things’] @arr => [‘Stuff’, ‘things’] ## [‘Stuff’, ‘things’]## <-what??? 好的…所以修改一个会改变其他的,让我们改回来? a[0] = ‘stuff’ a => [‘stuff’, ‘things’] @arr => [‘Stuff’, ‘things’] ## <- WHAT????? 为了完整性b [1]。资本化! 具有相同的效果,将所有三个arrays的第二个位置都大写 所以…大写结束时的爆炸是否会使它变得更加强大? 足够交叉到其他对象? 我知道其他方法,但这对我来说似乎非常奇怪。 […]

删除对象时运行方法

我正在学习ruby并且没有找到覆盖等效object.delete函数的方法: 这就是我这样做的方式: class Foo @@no_foo=0 def initialize @@no_foo+=1 end def delete #class specific cleanup… @@no_foo-=1 end def Foo.no_foo return “#@@no_foo” end end def delete(obj) #object independent cleanup… obj.delete return nil end foo1 = Foo.new foo2 = Foo.new puts Foo.no_foo puts foo2 foo2 = delete(foo2) puts foo2 puts Foo.no_foo 正如你所看到的,这是处理事情的一种hacky方式……有没有更简单的方法来解决这个问题? 基本上我想在减少该类的总计数器的同一调用中使我的对象无法访问。 在将变量(指向对象的指针)设置为nil时,我找不到一个被调用的方法。 我发现无法删除对象。

如何获得JavaScript样式的哈希访问?

我知道ActiveSupport提供的这个function。 h = ActiveSupport::OrderedOptions.new h.boy = ‘John’ h.girl = ‘Mary’ h.boy # => ‘John’ h.girl # => ‘Mary’ 但是我已经有一个大哈希,我想使用点表示法访问该哈希。 这是我试过的: large_hash = {boy: ‘John’, girl: ‘Mary’} h = ActiveSupport::OrderedOptions.new(large_hash) h.boy # => nil 那没用。 我怎样才能做到这一点。 我正在使用ruby 1.9.2 更新: 对不起我应该提到我不能使用openstruct,因为它没有Struct所具有的each_pair方法。 我事先不知道密钥所以我不能使用openstruct。

如何从Ruby中的字符串“A :: B :: C”获取类对象?

以下示例失败 class A class B end end p Object.const_get ‘A’ # => A p Object.const_get ‘A::B’ # => NameError: wrong constant name A::B UPDATE 前面提到的关于这个主题的问题 在String和Classname之间转换 Ruby String#to_class 在Ruby中按名称获取课程? 最后一个提供了一个很好的解决方案 ,可以演变成 class String def to_class self.split(‘::’).inject(Object) do |mod, class_name| mod.const_get(class_name) end end end class A class B end end p “A::B”.to_class # => A::B

Ruby Metaprogramming方法列表?

刚开始学习Ruby元编程。 看看Object.methods我得到: Object.methods => [ :allocate, :new, :superclass, :freeze, :===, :==, :, :<, :, :>=, :to_s, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_instance_methods, :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?, :const_missing, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, :class_variable_defined?, :module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?, :private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method, :autoload, :autoload?, :instance_method, :public_instance_method, :nil?, :=~, :!~, :eql?, :hash, :class, :singleton_class, […]

是否可以更改Ruby对象的类?

是否可以在实例化Ruby对象后更改它的类,例如: class A end class B end a = A.new a.class = B 或类似的。 (上面的代码没有运行,因为类是只读变量) 我知道这不可取,有点奇怪,而不是我打算做的事情,但有可能吗?

watir浏览器对象可以在以后的Ruby进程中重用吗?

所以,让我们说经常运行一个脚本来打开一个浏览器并做网络事情: require ‘watir-webdriver’ $browser = Watir::Browser.new(:firefox, :profile => “botmode”) => # 它可以使用browser.close优雅地结束,或者它可能会更快崩溃并留下需要大量内存的Firefox进程,直到它们累积并使服务器慢速爬行时才会被忽视。 我的问题有两个: 什么是一个好的做法,以确保即使在任何导致立即错误退出的脚本失败的情况下,子进程将始终被清理(我已经有许多短的begin-rescue-end块用于其他无关的小测试) 更重要的是,我可以简单地记住这个Watir :: Browser:0x7fc97b06f558对象地址或PID,并在一个全新的Ruby进程中将其重新分配给另一个$ browser变量,例如irb? 即,webdriver上的孤立浏览器可以在同一台机器上使用watir-webdriver在其他程序中重新附加? 从irb我可以进入并重新连接到崩溃的Ruby脚本留下的浏览器,检查它所在的网站,检查出错的地方,哪些元素与预期不同等等。 后者的另一个非常有利的用途是避免每天可能有数百个浏览器启动和关闭的开销……最好将一个活着作为一个守护进程。 第一次运行将尝试使用我专门准备的botmode配置文件重用以前的浏览器对象,否则创建一个。 然后我故意不在我的脚本末尾调用$ browser.close。 如果没有其他的东西我在工作中杀死Xvfb:99显示FF在一天结束时运行(无论如何,如果仍在运行,FF别无选择,只能死掉它)。 是的我知道Selenium独立jar,但也试图避免那个java服务足迹。 如果这是一个基本的Ruby问题,请道歉。 我只是不确定如何表达它并继续获得不相关的搜索结果。

ruby:质量初始化实例变量

是否有一种简单的方法来批量分配实例变量 def initialize(title: nil, label_left: nil, label_right: nil, color_set: nil) @title = title @label_left = label_left @label_right = label_right @color_set = color_set end 我可以循环/遍历初始化参数并自动分配吗?

获取ruby函数对象本身

在Ruby中,一切都应该是一个对象。 但是我有一个很大的问题,就是通常的方式来定义函数对象 def f “foo” end 与Python不同,f是函数结果,而不是函数本身。 因此, f() , f , ObjectSpace.f都是”foo” 。 f.methods返回字符串方法列表。 如何访问函数对象本身?

组合2个对象和排序轨道5

我想显示一个时间链接混合评论和发布所以我有这个对象 @posts = Post::all() @comments = Comment::all() 如果我这样做 @post.each … … end @comments.each … … end 我会得到第一篇文章,然后是评论。 但我想要一个时间表,我怎么能创造这个? 我需要结合两个对象来创建一个有序列表,例如: 在post中: id | name | date 1 | post1 | 2015-01-01 2 | post2 | 2013-01-01 在评论中: id | name | date 1 | comment1 | 2014-01-01 2 | comment2 | 2016-01-01 如果我这样做post.each … comments.each … […]