Ruby如何用双引号("")与String.new?初始化新字符串有什么不同?出于好奇和实验的目的,我覆盖了String#initialize:
class String
def initialize
puts "I <3 bananas" # they're delicious!
end
end
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是:为什么这两个例子不同?
# Calling the String class directly, I can declare banana love!
irb(main):054:0> String.new
I <3 bananas
=> ""
# Using double quotes, this string is not as tasty :(
irb(main):055:0> ""
=> ""
Run Code Online (Sandbox Code Playgroud)
这对研究很烦人,因为每个Google结果似乎都集中在基本的Ruby语法上,而我在Ruby文档中找不到任何东西.
嗨!对于以下Ruby方法,如何在不重写方法的情况下使用RSpec测试来模拟用户输入?
def capture_name
puts "What is your name?"
gets.chomp
end
Run Code Online (Sandbox Code Playgroud)
我发现了类似的问题,但这种方法需要使用类创建.RSpec是否支持对不在类中的方法进行存根?
我可以重写方法,所以它有一个变量,默认值为"gets.chomp",如下所示:
def capture_name(user_input = gets.chomp)
puts "What is your name?"
user_input
end
Run Code Online (Sandbox Code Playgroud)
现在我可以写一个像这样的RSpec测试:
describe "Capture name" do
let(:user_input) { "James T. Kirk" }
it "should be 'James T. Kirk'" do
capture_name(user_input).should == "James T. Kirk"
end
end
Run Code Online (Sandbox Code Playgroud) 当foo是未定义的变量时,尝试访问它会引发NameError:
foo
#=> NameError: undefined local variable or method `foo'
a = foo
#=> NameError: undefined local variable or method `foo'
Run Code Online (Sandbox Code Playgroud)
为什么不foo = foo加NameError?
foo = foo
#=> nil
Run Code Online (Sandbox Code Playgroud)
昨天,我花了几个小时来跟踪此行,这是程序中的错误...
capture = capture.to_i
Run Code Online (Sandbox Code Playgroud)
我原本打算做的是转换capture_str为Integer。相反,我所做的是nil通过说来引入a capture = capture,然后将零变为a 0。所以我在做这个...
capture = capture.to_i
#=> 0
Run Code Online (Sandbox Code Playgroud)
但是我一直错误地假设NameError会像这样抛出一个变量...
capture = capture_str.to_i
#=> NameError: undefined local variable or method `capture_str'
Run Code Online (Sandbox Code Playgroud) 我正在构建一个 Web 应用程序,用户单击一个按钮,然后单击发送一封电子邮件。在不稳定的连接上,有时用户会多次单击按钮,这会导致发送多封电子邮件。电子邮件是通过 Sendgrid 通过 SMTP 发送的。
如果多次提交相同的请求参数,是否有一种技术可用于仅发送一封电子邮件?我知道如何防止在我自己的应用程序上的 Web 表单之类的东西上多次提交,但我不确定如何使用 3rd 方电子邮件 API 做同样的事情。
当我运行以下两个JavaScript命令时......
> window.history.back(); alert("2nd");
...我希望窗口转到上一页,然后显示警报.实际上会发生"第二次"弹出,然后窗口又回来了.如果我像这样扭转他们......
> alert("2nd"); window.history.back();
...命令仍以相同的顺序执行.我对JavaScript控制流程有何了解?我怎么能window.history.back();先跑?
在Ruby中,我试图理解to_enum和enum_for方法之间的关系.在我提出问题之前,我已经提供了一些示例代码和两个示例来帮助上下文.
# replicates group_by method on Array class
class Array
def group_by2(&input_block)
return self.enum_for(:group_by2) unless block_given?
hash = Hash.new {|h, k| h[k] = [] }
self.each { |e| hash[ input_block.call(e) ] << e }
hash
end
end
Run Code Online (Sandbox Code Playgroud)
irb (main)> puts [1,2,3].group_by2.inspect
=> #<Enumerator: [1, 2, 3]:group_by2>
Run Code Online (Sandbox Code Playgroud)
在示例#1中:group_by在[1,2,3]不传入块的情况下调用数组,返回使用该命令生成的枚举器self.enum_for(:group_by_2).
irb (main)> puts [1,2,3].to_enum.inspect
=> #<Enumerator: [1, 2, 3]:each>
Run Code Online (Sandbox Code Playgroud)
在示例#2中,通过调用to_enum数组上的方法生成枚举器[1,2,3]
枚举器是否在示例1和2中生成,以任何方式表现不同?我可以从检查的输出中看到它们显示略有不同的标签,但我可以发现调查员的行为有任何不同.
# Output for example #1 …Run Code Online (Sandbox Code Playgroud)