用 pry 看吧
class C
end
C.define_singleton_method(:singletom_method) do
puts 'the seventh way to define class methods'
end
期待 2016 年的,想去和大牛们合个影。
定义类方法,方法多到炸
以前在你们网站注册过帐号耶
Seems god needs some better install /uninstall commands.
感谢开源,明天就 clone 一个学习一下楼主的源码。
while 不是判断,只是条件循环,它判断 gets 的返回值,如果 gets 返回 nil 或者 false 就跳出循环。你的代码和下面的代码是等价的
ARGV << "testfile"
loop do
gets ? print : break
end
我觉得你第二个链接里的办法不错啊。override Rail 的 association methods,然后注册一个 before save
#14 楼 @dudu_zzzz 基本上就是这个类的方法http://ruby-doc.org/core-2.3.0/RubyVM/InstructionSequence.html
但是这个虚拟机的指令集我找了半天都找不到资料,只有日文资料。貌似 rubyspec 只描述 ruby 语言级行为,关于 ruby 虚拟机怎么实现其实并没有统一标准可循。你要是能找到 MRI 的指令集资料记得告诉我一声。
题主的思路没错,就是句法太杂了。如果升到了 2.3 就赶紧用楼上的单身狗运算符,没有的话,判断一个对象是否为 nil 在代码中使用它本身就可以了(boolean 类型除外),没必要用 not + nil。
性能上也会有差别,not+nil 编译出来是这样的
0003 opt_send_simple <callinfo!mid:a, argc:0, FCALL|VCALL|ARGS_SKIP>
0005 opt_send_simple <callinfo!mid:nil?, argc:0, ARGS_SKIP>
0007 opt_not <callinfo!mid:!, argc:0, ARGS_SKIP>
0009 dup
0010 branchunless 22
而使用本身来判断只有一句
0003 opt_send_simple <callinfo!mid:a, argc:0, FCALL|VCALL|ARGS_SKIP>
0005 dup
0006 branchunless 18
用 Benchmark 试了下,效率差 30%
user system total real
simple 0.060000 0.000000 0.060000 ( 0.064289)
complex 0.090000 0.000000 0.090000 ( 0.092268)
恩,多谢关注,我升级到 43.0 之后发现也没有这个问题了。
哭了,用 firefox 好像没办法听,装个 chrome 试试好了,unbuntu 下浏览器真心太少。
你把定义 mouse 方法的语句注释掉了
建议楼主看看这篇文章 http://www.ibm.com/developerworks/cn/opensource/os-cn-rubysbl/
加了冒号相当于创建了一个 symbol 对象,所以传递的参数就是这个 symbol 对象,解释器不会认为它是一个方法或者变量,就好像你使用 componet("string"),componet(1) 是一个概念。
由于 Symbol 比 String 在执行时更为高效,所以在一些仅仅只需要表示"名称"的场合,Rubyist 都会倾向于使用 symbol。例如这个 hash{"name" => "adam"},String 当然也可以用来作为 key,但几乎没有人这样用,因为 Ruby 在处理 Symbol 时更加快速,占用的资源更少。许多方法都以 Symbol 而不是 String 来作为名称参数,比如 define_method(symbol, method) 。在 Rails 里,绝大多数 DSL 后面的参数,跟的也是 Symbol。虽然 Rails 有自己的补救方法可以兼容 Symbol 和 String,但最好还是使用 Symbol 来表示名称。
如果是浏览器载完页面再导出,是否可以考虑用 JS 来做。
#6 楼 @michael_roshen 你真给力,正想知道 What's new
分别是 m[1] 和 m[2]
m = /^<p>(\d+-\d+-\d+).+<p>(\d+)/.match(%q[<p>400-669-4525</p>\r\n\r\n<p>15001787892</p>\r\n\r\n<div id=\"xunlei_com_thunder_helper_plugin_d462f475-c18e-46be-bd10-327458d045bd\"> </div>\r\n")])
m[1]
# => 400-669-4525
m[2]
# => 15001787892
m = /^<p>(\d+-\d+-\d+).+<p>(\d+)/.match(...)
第一个应该很少有人会这么用,我觉得可以理解为 define_method。因为这时使用 def 这个方法,recieve 还是 MyClass 这个类,所以等同于在该类下面直接定义一个方法。
如果在 Ruby 中,定义一个类相当于是执行一段代码,那么在类中定义实例方法其实也可以理解为执行一段代码。具体的实现应该要看 CRuby 的源码还有底层的书,我猜 Ruby 解释器在类中扫描到 def 方法时,会将该方法写入符号表,至少让执行器知道该类包含这个方法,以及此方法的内存地址。但是这个过程中,方法内部的代码并没有被执行,所以必须要手工调用一次 method_one,method_two 才会被定义。
个人项目建议转移到 https://git.oschina.net/