我很惭愧地问这个,因为它似乎应该是显而易见的,但是如何判断字符串中的给定字符在Ruby中是大写还是小写?我认为String班上没有明显的罐装解决方案.
我采用了以下方法,它不考虑非ASCII代码:
def is_lower?(c)
c >= 'a' && c <= 'z'
end
def is_upper?(c)
! is_lower(c)
end
Run Code Online (Sandbox Code Playgroud)
我考虑过的其他事情是:
def is_lower?(c)
c != c.upcase
end
Run Code Online (Sandbox Code Playgroud)
这有什么更惯用的东西吗?
我刚学习ROR,我遇到了if/else语句.我也遇到了'elseif',但是我的文本编辑器(textmate)并没有把它当作关键字,程序也没有正常运行.
if name == 'Chris'
puts 'What a lovely name.'
elseif name == 'Katy'
puts 'What a lovely name!'
end
Run Code Online (Sandbox Code Playgroud)
我正在使用几年前写的"学习计划"一书.我想知道'elseif'是否被改变了,因为当我只是使用'else'时,它似乎正常运行.
我刚开始学习红宝石,这可能很容易解决.如何比较Ruby中的两个字符串?
我尝试过以下方法:
puts var1 == var2 //false, should be true (I think)
puts var1.eql?(var2) //false, should be true (I think)
Run Code Online (Sandbox Code Playgroud)
当我尝试将它们回显到控制台以便我可以直观地比较值时,我这样做:
puts var1 //prints "test content" without quotes
puts var2 //prints ["test content"] with quotes and braces
Run Code Online (Sandbox Code Playgroud)
最终这些不同类型的字符串如何比较这两个?
我已经完全绝望了 - 我花了一整天的时间尝试将rmagickgem 安装到Mac OS X Lion,但实际上这是一个悲剧.我在Google上看到了很多类似的主题,但没有任何帮助我.
我想完全卸载imagemagick通过brew并重新安装(这是运作良好),然后安装rmagick,但每次当我尝试安装这种宝石的时候,我收到此错误:
Building native extensions. This could take a while...
ERROR: Error installing rmagick:
ERROR: Failed to build gem native extension.
/Users/adam/.rvm/rubies/ruby-1.9.3-p327/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
extconf.rb:128: Use RbConfig instead of obsolete and deprecated Config.
checking for clang... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes …Run Code Online (Sandbox Code Playgroud) 我正在玩Rails 4.x beta并尝试使用carrierwave获取嵌套属性.不确定我正在做的是正确的方向.搜索后,最后查看导轨源和强参数,我发现了下面的注释.
Run Code Online (Sandbox Code Playgroud)# Note that if you use +permit+ in a key that points to a hash, # it won't allow all the hash. You also need to specify which # attributes inside the hash should be whitelisted.
所以它说你必须在has中指定每一个单独的属性,我尝试了以下内容:
帕拉姆的例子:
{"utf8"=>"?",
"authenticity_token"=>"Tm54+v9DYdBtWJ7qPERWzdEBkWnDQfuAQrfT9UE8VD=",
"screenshot"=>{
"title"=>"afs",
"assets_attributes"=>{
"0"=>{
"filename"=>#<ActionDispatch::Http::UploadedFile:0x00000004edbe40
@tempfile=#<File:/tmp/RackMultipart20130123-18328-navggd>,
@original_filename="EK000005.JPG",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"screenshot[assets_attributes][0][filename]\"; filename=\"EK000005.JPG\"\r\nContent-Type: image/jpeg\r\n">
}
}
},
"commit"=>"Create Screenshot"}
Run Code Online (Sandbox Code Playgroud)
调节器
def screenshot_params
params.require(:screenshot).permit(:title,
:assets_attributes => [:filename => [:@tempfile,:@original_filename,:@content_type,:@headers]
Run Code Online (Sandbox Code Playgroud)
以上不是"工作"(它不触发载波)但是当我使用我发现的标准嵌套示例时,我不再收到错误(未经许可的参数:文件名):
def screenshot_params
params.require(:screenshot).permit(:title, assets_attributes: :filename)
Run Code Online (Sandbox Code Playgroud)
如果有人能提供帮助就会很棒.我无法找到嵌套了一个指向哈希的键的示例.
我正在将数组转换为散列,其中键是索引,值是该索引处的元素.
我是这样做的
# initial stuff
arr = ["one", "two", "three", "four", "five"]
x = {}
# iterate and build hash as needed
arr.each_with_index {|v, i| x[i] = v}
# result
>>> {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Run Code Online (Sandbox Code Playgroud)
有没有更好的(在任何意义上"更好"这个词)这样做的方式?
使用rvm我将我的ruby升级到1.9.3-p392,也添加了2.0.0,我运行bundle命令时尝试使用这个版本时我得到了这个错误.
Could not load OpenSSL.
You must recompile Ruby with OpenSSL support or change the sources in your Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL using RVM are
available at rvm.io/packages/openssl.
Run Code Online (Sandbox Code Playgroud)
我已经按照几个不同的说明来解决这个问题.我试过删除版本并使用rvm选项安装它
--with-openssl-dir=$HOME/.rvm/usr
Run Code Online (Sandbox Code Playgroud)
我用rvm和macports安装了OpenSSL.两者都没有帮助解决问题.我甚至使用以下方法更改了ssl证书的文件位置:
export SSL_CERT_FILE=/Users/DarkLord/.rvm/usr/ssl/cert.pem
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都会继续得到错误.有人可以帮我解决这个问题吗?
为什么正则表达式不(?<=fo).*匹配foo(反之(?<=f).*)?
"foo" =~ /(?<=f).*/m => 1
"foo" =~ /(?<=fo).*/m => nil
Run Code Online (Sandbox Code Playgroud)
这似乎只在单线模式打开时发生(点匹配换行符); 没有它,一切都很好:
"foo" =~ /(?<=f).*/ => 1
"foo" =~ /(?<=fo).*/ => 2
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9.3和2.0.0上测试过.
编辑:更多观察:
添加行尾锚点不会改变任何内容:
"foo" =~ /(?<=fo).*$/m => nil
Run Code Online (Sandbox Code Playgroud)
但与懒惰的量词一起,它"有效":
"foo" =~ /(?<=fo).*?$/m => 2
Run Code Online (Sandbox Code Playgroud)
编辑:还有一些观察:
.+与它的等价物一样工作{1,},但仅限于Ruby 1.9(在这种情况下,这似乎是两者之间唯一的行为差异):
"foo" =~ /(?<=fo).+/m => 2
"foo" =~ /(?<=fo).{1,}/ => 2
Run Code Online (Sandbox Code Playgroud)
在Ruby 2.0中:
"foo" =~ /(?<=fo).+/m => nil
"foo" =~ /(?<=fo).{1,}/m => nil
Run Code Online (Sandbox Code Playgroud)
.{0,} 被破坏(1.9和2.0):
"foo" …Run Code Online (Sandbox Code Playgroud) 即使我无法创建模块的实例,我怎么可能在模块中有实例变量?以下@stack模块的目的是Stacklike什么?
module Stacklike
def stack
@stack ||= []
end
end
Run Code Online (Sandbox Code Playgroud) Ruby 2.3引入了一种新的方法Array并被Hash调用dig.我在关于新版本的博客文章中看到的例子是人为的,令人费解的:
# Hash#dig
user = {
user: {
address: {
street1: '123 Main street'
}
}
}
user.dig(:user, :address, :street1) # => '123 Main street'
# Array#dig
results = [[[1, 2, 3]]]
results.dig(0, 0, 0) # => 1
Run Code Online (Sandbox Code Playgroud)
我没有使用三嵌套平面数组.什么是如何有用的现实例子?
UPDATE
事实证明,这些方法解决了一个最常见的Ruby问题.下面的问题有20个重复,所有这些都通过使用dig以下方法解决: