Tag: ruby

如何使用gets.chomp测试函数?

我有一个使用gets.chomp的简单函数,如下所示: def welcome_user puts “Welcome! What would you like to do?” action = gets.chomp end 我想用ruby的内置TestCase套件测试它,如下所示: class ViewTest < Test::Unit::TestCase def test_welcome welcome_user end end 问题是,当我运行该测试时, gets.chomp停止测试,因为它需要用户输入某些内容。 有没有办法可以使用ruby模拟用户输入?

通过SO_RCVTIMEO套接字选项在Ruby中设置套接字超时

我试图通过SO_RCVTIMEO套接字选项在Ruby中使套接字超时,但它似乎对任何最近的* nix操作系统没有影响。 使用Ruby的Timeout模块不是一个选项,因为它需要为每个超时生成并加入线程,这可能会变得很昂贵。 在需要低套接字超时且具有大量线程的应用程序中,它基本上会导致性能下降。 在许多地方都已经注意到这一点,包括Stack Overflow 。 我已经阅读了Mike Perham关于此主题的优秀post,并努力将问题减少到一个可运行代码文件,创建了一个将接收请求的TCP服务器的简单示例,等待请求中发送的时间量和然后关闭连接。 客户端创建套接字,将接收超时设置为1秒,然后连接到服务器。 客户端告诉服务器在5秒后关闭会话,然后等待数据。 客户端应在一秒钟后超时,但在5之后成功关闭连接。 #!/usr/bin/env ruby require ‘socket’ def timeout sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) # Timeout set to 1 second timeval = [1, 0].pack(“l_2”) sock.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, timeval # Connect and tell the server to wait 5 seconds sock.connect(Socket.pack_sockaddr_in(1234, ‘127.0.0.1’)) sock.write(“5\n”) # Wait for data to […]

有没有办法在ruby 中返回方法参数名称

可能重复: 在Rubyreflection中获取参数名称 是否可以获取方法的参数名称? 示例: def method_called(arg1, arg2) puts my_method.inspect end 我想知道应该调用什么方法(my_method)来获得以下输出: [“arg1”, “arg2”]

Ruby – 参考引用或值?

我不明白为什么他们说 Ruby按值传递所有参数,同时下面的代码certificate了相反: class MyClass1 @var1 = 123 def get1 @var1 end def set1=value @var1 = value end end c1 = MyClass1.new c1.set1 = 444 p c1.get1 # 444 def test1 mc mc.set1 = 999 end test1 c1 p c1.get1 # 999 如果它是按值计算的,它将打印出444而不是999 。

为什么Ruby似乎从case语句中提升变量声明,即使该代码路径没有被执行?

我们定义一个函数foo: def foo(s) case s when’foo’ x = 3 puts x.inspect when ‘bar’ y = 4 puts y.inspect end puts x.inspect puts y.inspect end 然后我们将其称为: 1.9.3p194 :017 > foo(‘foo’) in foo scope 3 in outer scope 3 nil => nil 1.9.3p194 :018 > foo(‘bar’) in bar scope 3 in outer scope nil 3 => nil […]

使用Ruby / Mechanize(和Nokogiri)从HTML中提取单个字符串

我从论坛中提取数据。 我的脚本基于工作正常。 现在我需要从单个post中提取日期和时间(2009年12月21日,20:39)。 我无法让它发挥作用。 我使用FireXPath来确定xpath。 示例代码: require ‘rubygems’ require ‘mechanize’ post_agent = WWW::Mechanize.new post_page = post_agent.get(‘http://www.vbulletin.org/forum/showthread.php?t=230708’) puts post_page.parser.xpath(‘/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()’).to_s.strip puts post_page.parser.at_xpath(‘/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()’).to_s.strip puts post_page.parser.xpath(‘//[@id=”post1960370″]/tbody/tr[1]/td/div[2]/text()’) 我的所有尝试都以空字符串或错误结束。 我找不到有关在Mechanize中使用Nokogiri的任何文档。 Mechanize文档在页面底部显示: 使用Mechanize导航到需要刮擦的页面后,使用Nokogiri方法刮取它。 但有什么方法呢? 我在哪里可以通过样本和解释语法阅读它们? 我也没有在Nokogiri的网站上找到任何东西。

为什么很多人在Rails中使用“ – %>”而不是“%>”?

对不起这个问题,我认为它更具有offtopic,但我在谷歌上找不到任何东西! 我现在多次看到很多人使用-%>而不仅仅是%> 。 什么意思? 例: image.alt) %> 来源: Rails每6个项目的每个循环插入标记? 在这里,他还使用-%>表示所有块。

如何处理不是100的舍入百分比之和?

假设我们有一个带整数的项目列表: USA: 3 people Australia: 2 people Germany: 2 people 如果我们计算每个值与整个列表中的总和的百分比,我们得到: USA: 3/(3+2+2)*100 = 42.857…% Australia: 2/(3+2+2)*100 = 28.571…% Germany: 2/(3+2+2)*100 = 28.571…% 如果我们围绕它,我们得到: USA: 43% Australia: 29% Germany: 29% 总和43 + 29 + 29 = 101不是100,并且对软件的用户来说看起来有点奇怪。 你怎么解决这个问题?

无法连接:在“读取初始通信数据包”时丢失与MySQL服务器的连接,系统错误:0

我正在运行一个Rails应用程序所以现在我正在尝试远程连接到mysql并且我收到此错误无法连接:在’读取初始通信数据包’时失去与MySQL服务器的连接,系统错误:0

在Ruby 1.8中支持Ruby 1.9的哈希语法

我正在使用{key: ‘value’}语法为我的代码中的哈希编写一个Ruby gem。 我的测试全部通过1.9.x,但我(可以理解)在1.8.7中得到syntax error, unexpected ‘:’, expecting ‘)’ 。 是否有支持1.8.x的最佳实践? 我是否需要使用我们的老朋友重写代码=> ,还是有更好的策略?