问题:从哪里p获取它的价值,为什么会发生?
考虑这个irb会话:
me@somewhere:~$ irb
irb(main):001:0> a
NameError: undefined local variable or method `a' for main:Object
from (irb):1
irb(main):002:0> foo
NameError: undefined local variable or method `foo' for main:Object
from (irb):2
irb(main):003:0> p
=> nil
irb(main):004:0> p.class
=> NilClass
irb(main):005:0>
Run Code Online (Sandbox Code Playgroud)
我从未定义过p- 为什么它没有价值?既a没有foo被认出也没有被认出那么特别的是p什么?我也没有找到任何列出的内容Kernel#p
上下文:我正在阅读所谓的"28字节的红宝石快乐"并假设p是一个变量,如:def p.method_missing *_......
(别担心:我不打算在nil上实际定义method_missing ...只研究一些ruby代码......)
Ruby on Rails网站建议在Linux下从源代码安装Ruby.我在Ubuntu 9的干净安装中遇到了一些从源代码构建ruby的C库问题.
我在网上发现的关于在Ubuntu上安装ruby的所有说明都涉及使用预先打包的(.deb-based)ruby.显然,这不是铁人们推荐的.
当我做了一个干净的ruby源代码构建时,我发现Rubygems无法安装,因为zlib扩展不起作用.
出现两个问题:
1)没有构建zlib扩展.
解:
i)确保在ruby源的extn目录中的Setup文件中取消注释zlib,并且
ii)确保安装了这些zlib ubuntu软件包:
aptitude install zlib1g
aptitude install zlib1g-dbg
aptitude install zlib1g-dev
aptitude install zlibc
Run Code Online (Sandbox Code Playgroud)
2)在修复上面的问题1(并进行ruby的干净重建)之后,zlib仍然无法正常工作,因为扩展无法加载.
您可以通过运行此命令并输出"false"来查看模块无法加载:
puts require 'zlib'
Run Code Online (Sandbox Code Playgroud)
我观察到这发生在extn目录中的任何其他C扩展中,因此对于这些扩展而言似乎是一个更普遍的问题,而不仅仅是zlib特有的.
总结一下:
有没有办法可以找出模块无法加载的原因?某种痕迹/详细模式?
格雷格威尔逊的谈话"一些证据"(http://www.slideshare.net/gvwilson/bits-of-evidence-2338367)讨论了以下声称背后的证据,即Martin Fowler已经提出使用DSL的好处:
"[使用领域特定语言]带来两个主要好处.第一个,也是最简单的是提高程序员的工作效率.第二个......是......与领域专家的沟通." - 2009年7月/ 8月IEEE Software的 Martin Fowler
问题:是否有任何实证研究提供证据证明程序员的工作效率得到提高或与使用DSL的领域专家的沟通得到改善?
许多构建DSL的人无法为"你为什么要构建DSL?"提供合理的答案.并且"为什么DSL会帮助你而不是一个考虑周全的对象模型呢?"
我听到很多"我这样做是因为它很酷而其他人都在做" - 这不是一个理性的答案.
我认为DSL至少在某些时候是有用的,但它们不太可能成为应该不加选择地使用的"银弹".我希望看到一些科学着作,描述何时应该和不应该使用DSL--基于实证研究.
如果"flag"为真,我必须执行步骤号.1否则跳过它.有没有办法在循环中跳过这种不必要的重复检查.(因为执行循环时flag的值没有改变)
private void method(boolean flag) {
while (man > woman) {
if (flag) {
// Step no. 1
System.out.println(flag);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在遍历一个对象图,并希望传递一个块,该块将从一个方法运行在结构的每个节点上 - 让我们称之为访问.
在顶部,我将调用一个块,我想委托初始调用访问根对象以访问其他对象.我可以使用&last_parameter_name将块解压缩到本地proc中 - 但是如何在我委托的调用中将proc转回块?
这是一个简化的例子,我先调用(...)并希望将块委托给我的第二个调用(...)
def second(&block) # ... ? ...
block.call(72)
end
def first(&block)
puts block.class # okay - now I have the Proc version
puts 'pre-doit'
block.call(42)
puts 'post-doit'
second( ... ? ...) # how do I pass the block through here?
end
first {|x| puts x*x}
Run Code Online (Sandbox Code Playgroud)
注意:我需要在first()和second()上使用相同的约定 - 即它们需要采用相同的东西.
阅读并尝试了答案后,我想出了一个更全面,更有效的例子:
class X
def visit(&x)
x.call(50)
end
end
class Y < X
def visit(&x)
x.call(100)
X.new.visit(&x) …Run Code Online (Sandbox Code Playgroud)