我有一个包含辅助类的文件,如下所示:
应用程序/类/ myfile.rb
Module mymodule
class myclass
# blah blah
end
end
Run Code Online (Sandbox Code Playgroud)
我想在控制器中使用这个类,所以我写了这样的东西:
require 'myfile'
class MyController < ApplicationController
include mymodule
def index
mymodule::myclass.new
end
end
Run Code Online (Sandbox Code Playgroud)
控制器的路由定义如下:
match 'mycontroller', :to => 'mycontroller#index'
Run Code Online (Sandbox Code Playgroud)
现在我面对的是奇怪的行为.它在服务器启动后的第一次运行时完美运行.但是当我刷新页面或再次点击URL时,我收到以下错误.
Routing Error
uninitialized constant MyController::mymodule
Run Code Online (Sandbox Code Playgroud)
我无法从错误中找出任何东西,也不能理解为什么它从第二次打击起不起作用.发生了什么?
我正在寻找相当于Ruby中的haskell instersperse函数.基本上,在列表的每个元素之间添加一些东西(比如分隔符).
intersperse(nil, [1,2,3]) => [1,nil,2,nil,3,nil,4].
Run Code Online (Sandbox Code Playgroud)
我不是要求任何代码(我可以做到,我可能在你阅读这个问题之前已经完成了).我只是想知道标准Ruby平台上是否已经存在这样的功能.
我不是要求任何代码,尤其是那些使用flatten的代码,因为它不起作用(flatten不仅平坦一个级别而且全部).我给出了示例[1,2,3]作为示例,但它应该可以使用
[[1,2],[3,4]].interperse("hello") => [[1,2], "hello", [3,4]]
Run Code Online (Sandbox Code Playgroud)
(请不要向我发送任何代码以使其有效,我已经拥有它
class Array
def intersperse(separator)
(inject([]) { |a,v| a+[v,separator] })[0...-1]
end
end
Run Code Online (Sandbox Code Playgroud)
)
当在Ruby中继承类时,单例类也会被继承:
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
Run Code Online (Sandbox Code Playgroud)
但是对于模块,情况并非如此:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
Run Code Online (Sandbox Code Playgroud)
为了解决这个限制,许多人都会诉诸这个丑陋的黑客:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
Run Code Online (Sandbox Code Playgroud)
好的,我的问题是:这个模块限制背后有理论/概念上的原因吗?还是只是一个实施难度?
在查看C源代码(YARV/MRI)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢
我试着寻找这个,但找不到多少.这似乎是之前可能会被问到的事情(很多次?),所以我很抱歉,如果是这样的话.
我想知道在Ruby中解析文件某些部分的最快方法是什么.例如,假设我知道我想要的特定功能的信息是在1000行文件的第500行和第600行之间.(显然这类问题适用于大型文件,我只是为了举例而使用那些较小的数字),因为我知道它不会出现在上半部分,是否有一种忽略这些信息的快速方法?
目前我正在使用以下内容:
while buffer = file_in.gets and file_in.lineno <600
next unless file_in.lineno > 500
if buffer.chomp!.include? some_string
do_func_whatever
end
end
Run Code Online (Sandbox Code Playgroud)
它有效,但我不禁认为它可以更好地工作.
我对Ruby很陌生,并且有兴趣学习新的工作方式.
在尝试解决在irb中找到的Gem时,而不是在Ruby中,我试着看看require 'rubygems'对我自己的安装有什么影响:
$ irb
irb(main):001:0> RUBY_VERSION
=> "1.8.7"
irb(main):002:0> $:
["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."]
=> nil
irb(main):003:0> require "rubygems" # Hasn't been required already
=> true
irb(main):004:0> require "rubygems" # Will return false, because it's already been required
=> false
irb(main):005:0> $: # Same as before
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."]
Run Code Online (Sandbox Code Playgroud)
如果请求rubygems不修改$:,那么它如何帮助查找文件?它是monkeypatch require吗?如果是这样,它使用什么变量来查找rubygem安装的库?
我有一个yaml文件文件有类似的键: -
line:
title: line-name
department: transcription
input_formats:
- input_format:
name: company
required: true
valid_type: general
- input_format:
name: website
required: false
valid_type: url
Run Code Online (Sandbox Code Playgroud)
生成new_file.yml后,键按字母顺序排序: -
line:
department: transcription
input_formats:
-
input_format:
name: company
required: true
valid_type: general
-
input_format:
name: website
required: false
valid_type: url
title: line-name
Run Code Online (Sandbox Code Playgroud)
打开sample_file并生成new_file的代码如下: -
require 'yaml'
require 'ya2yaml'
@file = YAML::load(File.open("/Users/manish/Desktop/yaml/sample_file.yml"))
@new_file = File.new("/Users/manish/Desktop/yaml/new_file.yml", "w+")
@new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats']))
Run Code Online (Sandbox Code Playgroud)
@new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats'])),但它不起作用.我如何保留订单?我阅读了博客文章JRuby Performance:Exceptions不是流量控制,它主张避免使用Exceptions,除非是特殊情况.
我意识到我犯了使用救援来定期处理LoadErrors的罪行.
是否有替代require尝试加载文件(如果存在),但如果不存在则不会抛出异常?
背景:如果你想知道"你为什么要求你不要求?",这是我的故事:
require "rdoc/usage"如果我没有在命令行应用程序中输入正确数量的参数,我可以提供使用信息.这会在开箱即用的1.9上引发异常.我有一个对象数组,其中一些响应:描述,我想从第一个描述得到描述.我能做到这一点:
objects.detect{|o| o.try(:description)}.description
Run Code Online (Sandbox Code Playgroud)
或这个:
objects.map{|o| o.try(:description)}.detect{|o| o}
Run Code Online (Sandbox Code Playgroud)
但第一个不是DRY(描述在那里两次),第二个是在找到值之前遍历整个数组.ruby标准库中有什么东西,或者Rails对它的扩展,这可以让我做这样的事情:
objects.detect_and_return{|o| o.try(:description)}
Run Code Online (Sandbox Code Playgroud)
我知道我可以轻松地编写它,但标准库足够大,我可能不需要.有没有像我这样的功能detect_and_return?
练习要求为所提供的每个功能编写单元测试.我正在测试的一个项目是,是否引发了适当的异常.建议我们assert_raise为此目的使用.
这是我正在测试的代码:
class ParserError < Exception
end
Pair = Struct.new(:token, :word)
def peek(word_list)
begin
word_list.first.token
rescue
nil
end
end
def match(word_list, expecting)
word = word_list.shift
if word.token == expecting
word
else
nil
end
end
def skip_word(word_list, token)
while peek(word_list) == token
match(word_list, token)
end
end
def parse_verb(word_list)
skip_word(word_list, :stop)
if peek(word_list) == :verb
return match(word_list, :verb)
else
raise ParserError.new("Expected a verb next.")
end
end
Run Code Online (Sandbox Code Playgroud)
这是测试,对于函数parse_verb:
def test_parse_verb
list_one = [Pair.new(:verb, 'go'), Pair.new(:noun, 'king')]
assert_equal(parse_verb(list_one), Pair.new(:verb, 'go')) …Run Code Online (Sandbox Code Playgroud) ruby unit-testing assert assertraises learn-ruby-the-hard-way
我记得case在Ruby 2.0的语句中允许使用procs ,但我不能谷歌.
我尝试检查Ruby 2.0.0 NEWS以及如何在Ruby中编写switch语句.我也访问过http://ruby-doc.org,但它对关键字的链接是针对Ruby 1.9而不是Ruby 2.0.
案件陈述中是否允许过程?
ruby ×10
rubygems ×2
assert ×1
assertraises ×1
exception ×1
fileparsing ×1
inheritance ×1
lines ×1
mixins ×1
module ×1
require ×1
ruby-2.0 ×1
singleton ×1
unit-testing ×1
yaml ×1