• 搞不懂为什么这个例子要判断元素的类型,跟 Array 的 initialize 有什么关系?给个更有实际意义的例子吧。。。

  • 关于 and 关键字 at 2018年11月16日

    就是普通的逻辑运算,常用于短路操作。几乎等价于&&,但优先级更低。

  • Storage.singleton_class.class_eval来定义类方法挺繁琐的,在项目中一般直接用Storage.instance_eval或者在类中用class<<self打开单例类

  • 文件中,在顶级作用域中定义的方法会成为 Object 的 private 方法,所以你在文件中定义 meet,所有对象也会继承这个方法,只是它是 private 的,调用时要省略调用者,或者使用 send。而在 irb 的顶级作用域中定义的方法会成为 Object 的 public 方法,所以你可以直接显式调用。至于为什么会有这样的处理方式,我也木有看过比较权威的说法😕

  • 求助二维数组去重 at 2018年10月29日

    楼主的例子说了这么多,我的理解就是数组去重。。。

    没咋倒腾过算法,自己写怎么都要遍历一次吧 (O(n) 的时间复杂度),随手写大概是这样:a.each_with_object({}){|ar, hsh| hsh[ar] = true}.keys,不知道能不能跑赢a.uniq! 。楼主把代码贴出来撒

  • ruby 项目里要是有人这么写会被群嘲的。楼主以前写过 ruby,看来之前学的 ruby 基础就不咋牢靠。。。

    楼主描述问题的时候需要更准确一点,一是因为 ruby 里不把@nilv称为成员变量,而叫实例变量 (楼主是写 java 的吧?),二是因为 test 方法是不会报"error"的,只是 test 方法没有达到你期望的效果而已(看完这里,楼主是不是要机智的修改问题描述了)。

    没达到效果的原因是 ruby 把get_nilv = 3解释成了局部变量赋值,你在 test 中加上一行p get_nilv就会发现输出了 3。如果你想让 ruby 把它解释成方法名而不是变量名,需要使用self.get_nilv=3。当然,这时候才会真正的报 error,提示你没有get_nilv=这个 setter 方法。这个带等号的标识符是方法名,而 3 是它的参数(如果楼主看到这里表示很惊讶的话,就需要反思自己的 ruby 学习历史是不是遗漏了很多东西)。你可以定义get_nilv=这个方法来解决问题,不过你更需要了解attr_accessor这个类方法,这时候你就会知道以上代码有多奇怪了。。。

    以上知识点应该是任何一本 ruby 基础书籍前 4 章的内容,建议楼主还是先停下 leetcode,仔细的看看书吧。

  • 原来如此。我就很奇怪为什么会有这么多人跑偏。也看不到问题编辑历史。。。

  • 除了@jjym,楼上诸位的答案都跑偏了。

    楼主说的应该是列表生成式,不过示例代码并不完整,推断代码应该是[x + 1 for x in [1,2,3]],其实就是把 for in 语句写在一行里,再省略了列表容器 (python 的列表相当于 ruby 中的数组)。这段 py 代码等价于 ruby 中的[1,2,3].map{|x| x+1}

    更复杂的列表生成式[m + n for m in 'XY' for n in 'AB'],实际上就是个嵌套的 for in 循环,结果是 ['XA', 'XB', 'YA', 'YB'],用 ruby 写出来是'XY'.chars.product('AB'.chars).map(&:join)(可能有更优雅的写法)。

    如同@jjym所说,ruby 中的枚举方法和 block 可以实现列表生成式的效果。个人认为这种语法在 ruby 中显得不那么面向对象,毕竟 ruby 一直倡导使用 each 等枚举方法来替代 for in 语句。相信有很多人都没有在 (或者极少在)ruby 中使用 for in。

  • 楼上的方法可行,不过更直接的方式是 100.downto(0)

  • 大兄弟,首先你的代码有问题,times 方法本身就能实现迭代了,为啥还要接个 each 方法?所以你这个问题表述也不对了,整个表达式的结果实际是 each 方法的返回值,而不是 times 的。

    其次,api 文档里写的很清楚,无论 times 还是 each,在接了代码块的时候,返回的都是 self。多看 API 啊

  • 想请教大家一个问题。 at 2018年07月19日
    values = [[1,2,3,4,5],[9,8,7,6,5]]
    attributes = [:attr_1, :attr_2, :attr_3, :attr_4, :attr_5]
    
    pairs = values.map { |v| attributes.zip(v).to_h }
    tabel.where(:data_type => @type).each {|rcd| rcd.update_attributes(pairs.shift)}
    

    没有测试过

  • 在《重构--ruby 版》一书中,作者详细描述过临时变量是代码的 bad smell,具体原因我只记得一点了,就是临时变量不能在方法之间共用(也有可能我没记住关键的原因)。作者倡导定义查询方法替换临时变量。其实我觉得严格按照作者说的做有点矫枉过正,实际上在项目中,我也不会把木有复用需求的代码抽成方法。但是谁能保证以后一定没有复用需求呢?

  • Ruby 的类变量 (修正版) at 2018年05月06日

    赞。不过楼主应该把 ruby 的版本写出来。 在 ruby2.4.1 的版本中,class_variables 方法默认会把继承链上的类变量输出,例子中现在应该给 class_variables 加上 false 参数咯

  • 先谢谢楼主的翻译,之前正在看英文版,结果一搜另一个问题就找到中文版😆 。 然后给楼主提个建议:“Enumerable 是急切的 (这里翻译的不好,想不出更好的词了)”。 建议楼主使用“贪婪”这个词,正则表达式中的“贪婪匹配”,rails 中的“贪婪加载”,对应的英文也是 eager