我总是这样做来测试Ruby中的字符串相等性:
if mystring.eql?(yourstring)
puts "same"
else
puts "different"
end
Run Code Online (Sandbox Code Playgroud)
这是在没有测试对象相等性的情况下执行此操作的正确方法吗?
我正在寻找最简洁的方法来根据内容测试字符串.
用括号和问号,这看起来有点笨重.
我有两个包含相同方法的模型:
def foo
# do something
end
Run Code Online (Sandbox Code Playgroud)
我应该把它放在哪里?
我知道常用代码在Rails应用程序的lib目录中.
但是如果我把它放在一个lib名为' Foo' 的新类中,并且我需要将它的功能添加到我的两个中ActiveRecord models,我是这样做的:
class A < ActiveRecord::Base
includes Foo
class B < ActiveRecord::Base
includes Foo
Run Code Online (Sandbox Code Playgroud)
然后这两个A和B将包含foo就像我在每个定义的方法就可以了?
据我所知,接口是Java旨在通过为实现接口填充的类布置方法来强制执行设计.这也是Ruby模块的想法吗?我看到,就像Java中的Interfaces一样,你无法在Ruby中实例化一个模块.
似乎很多库/插件都使用这种语法:
def self.included(base) # :nodoc:
base.extend ClassMethods
end
Run Code Online (Sandbox Code Playgroud)
为什么这个:nodoc:部分是必要的?
如果我在Ruby中有一个声明我想继续下一行,通常我会在行的末尾添加一个反斜杠,如下所示:
print x \
+ y
Run Code Online (Sandbox Code Playgroud)
但如果我对该行有评论,它就不起作用:
print x #show x
+ y # show y
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?
(编辑:Squeegy的解决方案是正确的,实际上,我知道你可以做到这一点,但我特别想知道是否有一种方法可以在与反斜杠相同的行上发表评论).
A类和B类相同:
class A < ActiveRecord::Base
def foo
puts "foo"
end
end
class B < ActiveRecord::Base
def foo
puts "foo"
end
end
Run Code Online (Sandbox Code Playgroud)
像这样重构与基类之间有什么区别:
class Base < ActiveRecord::Base
def foo
puts "foo"
end
end
class A < Base
end
class B < Base
end
Run Code Online (Sandbox Code Playgroud)
与使用基本模块的情况相比:
module Base
def foo
puts "foo"
end
end
class A < ActiveRecord::Base
include Base
end
class B < ActiveRecord::Base
include Base
end
Run Code Online (Sandbox Code Playgroud)
有一种方式优于另一种方式吗?
这种语法在功能上是否等效
def self.included(base)
base.class_eval do
extend ClassMethods
end
end
Run Code Online (Sandbox Code Playgroud)
这个?
def self.included(base)
base.extend ClassMethods
end
Run Code Online (Sandbox Code Playgroud) 当我运行Rails应用程序时,它会正确找到我安装的所有宝石.
这是我第一次尝试从irb内部调用一些宝石而无法找到它们.
blocke:~$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'rails'
LoadError: no such file to load -- rails
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from (irb):2
irb(main):003:0>
Run Code Online (Sandbox Code Playgroud)
当我运行"宝石环境"时,这就是我得到的:
blocke:~$ gem environment
RubyGems Environment:
- RUBYGEMS VERSION: 1.3.5
- RUBY VERSION: 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
- INSTALLATION DIRECTORY: /usr/lib/ruby/gems/1.8
- RUBY EXECUTABLE: /usr/bin/ruby1.8
- EXECUTABLE DIRECTORY: /usr/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-linux
- GEM PATHS:
- /usr/lib/ruby/gems/1.8
- /home/blocke/.gem/ruby/1.8
- GEM CONFIGURATION:
- :update_sources => true …Run Code Online (Sandbox Code Playgroud) 我想在MS-DOS中打印程序的输出,所以我写了一个.bat文件,上面写着:
cls
ruby foo.rb
Run Code Online (Sandbox Code Playgroud)
但输出 - 因为它出现在我的命令提示符 - 看起来像这样:
c:\workspace>ruby foo.rb
foo output
c:\workspace>
Run Code Online (Sandbox Code Playgroud)
我想插入一个新行到使用MS-DOS的输出,因为我不想亵渎我的Ruby代码与任何不相关的代码的作用应该做的事情.
MS-DOS中看起来像我想要的唯一命令是'type'和'print',但它们都用于打印文件.
我尝试使用两个空行创建一个文本文件,并使用'type'命令输出它,但它看起来很乱.
任何想法,将不胜感激.
我运行了“ gem sources -c”,这样我就必须特意指定要从哪里安装 gem,因为我现在有 3 个不同的 gem 安装源 - RubyForge、Github 和 Gemcutter。
C:\>gem sources -c
*** Removed specs cache ***
*** Removed user source cache ***
*** Removed latest user source cache ***
*** Removed system source cache ***
*** Removed latest system source cache ***
Run Code Online (Sandbox Code Playgroud)
运行此命令后,我再次运行gem sources以确保我不再有任何默认源,我得到以下信息:
C:\>gem sources
*** CURRENT SOURCES ***
http://gems.rubyforge.org
http://gems.github.com
http://gems.rubyforge.org/
http://gemcutter.org
Run Code Online (Sandbox Code Playgroud)
换句话说,一切都没有改变。
查看gem sources -c下面的帮助,这似乎是一次删除所有宝石源的正确命令:
-c, --clear-all Remove all sources (clear the cache)
Run Code Online (Sandbox Code Playgroud)
不然的话,看来你得把它们一一删除了。没什么大不了的,因为我只有 …
是否有网络小工具或服务或一些开源解决方案来执行此操作?
或者人们只是在HTML中手动编码?
我需要在网页上添加一些Ruby和Python代码.
如果我写这个,一切正常:
class A < ActiveRecord::Base
acts_as_taggable
end
Run Code Online (Sandbox Code Playgroud)
但是,如果我acts_as_taggable把它放入A类包含的模块中,我会收到一个错误:
module B
def self.included(base)
base.class_eval do
extend ClassMethods
include InstanceMethods
end
end
module ClassMethods
acts_as_taggable
end
module InstanceMethods
end
end
class A < ActiveRecord::Base
include B
Run Code Online (Sandbox Code Playgroud)
上面代码中的错误是:
undefined local variable or method `acts_as_taggable' for C::ClassMethods:Module
Run Code Online (Sandbox Code Playgroud)
acts_as_taggable从附带的模块打电话不正确吗?
它是否需要在类定义中?
我使用反斜杠继续下一行的Ruby语句.
print abc \
+ def
Run Code Online (Sandbox Code Playgroud)
我在反斜杠之后添加了一个空格,因为我喜欢把事情搞砸了,果然,我收到了一个错误:
意外的$ undefined,期待$ end
我假设$ undefined是一个全局变量,这意味着编译器看到它无法识别的任何东西 - 在这种情况下是反斜杠之后的空格.
$ end是一个引用"行尾"字符的全局变量吗?
这些全局变量在我的程序中是全局的还是比它更全局?它们的全球性如何?
ruby ×11
activerecord ×2
mixins ×2
newline ×2
rubygems ×2
batch-file ×1
dos ×1
formatting ×1
html ×1
inheritance ×1
interface ×1
irb ×1
java ×1
module ×1
rdoc ×1
undefined ×1
web ×1