我有一个包含辅助类的文件,如下所示:
应用程序/类/ 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)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢
任何人都可以解释为什么以下代码中止错误
irb(main):186:0> print ((1..10).collect do |x| x**2 end)
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block,
expecting ')'
print ((1..10).collect do |x| x**2 end)
^
(irb):186: syntax error, unexpected keyword_end, expecting $end
print ((1..10).collect do |x| x**2 end)
^
from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)
而具有相同功能的以下代码是否按预期工作?
irb(main):187:0> print ((1..10).collect { |x| x**2 })
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil
Run Code Online (Sandbox Code Playgroud)
我确实认为花括号"{}"可以在块定义中任意替换"do end".
我知道我可以通过省略print方法和第一个括号之间的空格来"修复"第一个调用,但我对解释它为什么表现不同感兴趣 .
在尝试解决在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安装的库?
我有一个带有类变量的模块
module Abc
@@variable = "huhu"
def self.get_variable
@@variable
end
class Hello
def hola
puts Abc.get_variable
end
end
end
a = Abc::Hello.new
a.hola
Run Code Online (Sandbox Code Playgroud)
是否可以不使用方法进入@@variable内部?我的意思是说会很好.只是好奇.Helloget_variableAbc.variable
我有一个对象数组,其中一些响应:描述,我想从第一个描述得到描述.我能做到这一点:
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?
s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
Run Code Online (Sandbox Code Playgroud)
这似乎是错误的,我希望得到 "#main= \\'quotes\\'"
当我不使用转义字符时,它按预期工作.
s.gsub "'", "*" # => "#main= *quotes*"
Run Code Online (Sandbox Code Playgroud)
所以必须与逃避有关.
使用ruby 1.9.2p290
我需要用反斜杠和引号替换单引号.
更多的不一致:
"\\'".length # => 2
"\\*".length # => 2
# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)
# WTF next:
"'".gsub("'", "\\'").length # => 0
# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我有一个简单的Rails应用程序,我想部署到Heroku.当我运行以下命令
git push heroku master
Run Code Online (Sandbox Code Playgroud)
显示以下错误消息.
Could not find multi_json-1.3.1 in any of the sources
!
! Failed to install gems via Bundler.
!
! Heroku push rejected, failed to compile Ruby/rails app
Run Code Online (Sandbox Code Playgroud)
这是我的Gemfile
gem 'rails', '3.2.3'
gem 'pg'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'therubyracer', :platform => :ruby
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
Run Code Online (Sandbox Code Playgroud) 我很好奇是否有办法制作Rubocop lint/stylecop html.erb文件?我意识到html会使嵌入式Ruby的样式变得困难.有没有人能够让Rubocop这样做?如果没有,是否有用于此目的的等效工具?我使用过rails_best_practices,并没有按照预期的那样工作.