我正在使用 WEBrick 构建一个小型应用程序。它运行良好。但是,它占用了一个端口。我宁愿将其实现为 unix 套接字,但我不知道该怎么做。
我正在使用 WEBrick 版本 1.8.1 和 ruby 3.0.2p107 (2021-07-07 修订版 0db68f0233) [x86_64-linux-gnu]
我正在使用 WEBrick 构建一个小型应用程序。它运行良好。但是,它占用了一个端口。我宁愿将其实现为 unix 套接字,但我不知道该怎么做。
我正在使用 WEBrick 版本 1.8.1 和 ruby 3.0.2p107 (2021-07-07 修订版 0db68f0233) [x86_64-linux-gnu]
我理解文件锁定的一般概念,但恐怕细节我不太清楚。我想打开一个文件进行写入,获取独占锁,但要等待几秒钟才能放弃获取锁。我到目前为止:
File.open(path, 'a') do |file|
if file.flock(File::LOCK_EX | File::LOCK_NB)
file.seek(0, IO::SEEK_END)
file.write('my content')
else
puts "Could not acquire lock, another process is using the file"
end
end
我如何等待锁x秒?
我正在编写一个脚本,该脚本可能会在程序的许多不同点正常退出。该脚本当前始终在确保块中向 STDOUT 输出一条消息,如下所示:
begin
exit
ensure
puts "my message"
end
问题是,如果脚本崩溃,消息无论如何都会输出,然后是错误消息。我想要做的是只在退出 0 时输出消息,如下所示:
begin
exit 1
ensure
if is_this_a_normal_exit?()
puts 'my messsage'
end
end
有办法吗?
我有一个 Rails 8.0.1 应用程序 (Ruby 3.3.4),正在将其部署到 Heroku。代码推送成功,但每当我运行时:
heroku run rails db:migrate
我收到此错误:
ActiveRecord::ConnectionNotEstablished: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed
似乎 Rails 正在尝试通过本地 PostgreSQL 套接字进行连接,而不是使用 Heroku 的 Postgres 插件。在本地,使用 rails db:migrate 一切正常。在 Heroku 上,我已经运行了:
heroku addons:create heroku-postgresql:essential-0
…插件创建成功。我的 Gemfile 包括:
gem "rails", "~> 8.0", ">= 8.0.1"
gem "pg", "~> 1.5"
# ...
这是我的数据库.yml:
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: brikex2_development
test:
<<: *default
database: brikex2_test
production:
primary: &primary_production
<<: *default
database: brikex2_production
username: brikex2
password: <%= ENV["BRIKEX2_DATABASE_PASSWORD"] %>
cache:
<<: *primary_production
database: brikex2_production_cache
migrations_paths: db/cache_migrate
queue:
<<: *primary_production
database: brikex2_production_queue
migrations_paths: db/queue_migrate
cable:
<<: *primary_production
database: brikex2_production_cable
migrations_paths: db/cable_migrate
我需要帮助如何正确配置我的项目来解决问题
是否有 Ruby 模块或类提供有关当前正在运行但不是当前进程的信息?例如,如果我有 pid 1234,我想获取有关进程用户、时间等的信息。我可以通过 shell 来获取此信息ps
,但我更喜欢从 Ruby 获取信息。例如,类似于以下虚构代码:
require 'process/info'
process = ProcessInfo.new(1234)
puts process.pid
puts process.user
任何帮助都值得感激。
尽管bsearch
和bsearch_index
对于整数数组来说工作正常,但它们似乎对字符串数组存在问题。
sorted_strings = %w[aaa aab aac bbb bbc bbd ccc ccd cce]
#=> ["aaa", "aab", "aac", "bbb", "bbc", "bbd", "ccc", "ccd", "cce"]
sorted_strings.bsearch_index { |x| x.start_with? 'a' }
#=> nil
sorted_strings.bsearch_index { |x| x.start_with? 'aaa' }
#=> nil
sorted_strings.bsearch_index { |x| x.start_with? 'b' }
#=> 3
sorted_strings.bsearch_index { |x| x.start_with? 'c' }
#=> 6
sorted_strings.bsearch_index { |x| x.start_with? 'cce' }
#=> 8
sorted_strings.bsearch { |x| x.start_with? 'a' }
#=> nil
sorted_strings.bsearch { |x| x.start_with? 'aa' }
#=> nil
sorted_strings.bsearch { |x| x.start_with? 'aaa' }
#=> nil
sorted_strings.bsearch { |x| x.start_with? 'b' }
#=> "bbb"
永远不应该返回 Nil。这是一个错误吗?
与组合比较运算符进行比较时,会返回更疯狂的结果:
sorted_strings = %w[aaa aab aac bbb bbc bbd ccc ccd cce]
#=> ["aaa", "aab", "aac", "bbb", "bbc", "bbd", "ccc", "ccd", "cce"]
sorted_strings.bsearch_index { |x| x <=> 'a' }
#=> nil
sorted_strings.bsearch_index { |x| x <=> 'aaa' }
#=> nil
sorted_strings.bsearch_index { |x| x <=> 'b' }
#=> nil
sorted_strings.bsearch_index { |x| x <=> 'bbb' }
#=> nil
sorted_strings.bsearch_index { |x| x <=> 'bbc' }
#=> 4
鉴于上述方法无效,我不明白为什么下面的方法有效:
sorted_strings = %w[aaa aab aac bbb bbc bbd ccc ccd cce]
#=> ["aaa", "aab", "aac", "bbb", "bbc", "bbd", "ccc", "ccd", "cce"]
sorted_strings.bsearch_index { |x| x >= 'a' }
#=> 0
sorted_strings.bsearch_index { |x| x >= 'aa' }
#=> 0
sorted_strings.bsearch_index { |x| x >= 'aaa' }
#=> 0
sorted_strings.bsearch_index { |x| x >= 'b' }
#=> 3
sorted_strings.bsearch_index { |x| x >= 'bbc' }
#=> 4
sorted_strings.bsearch_index { |x| x >= 'cc' }
#=> 6
sorted_strings.bsearch_index { |x| x >= 'cce' }
#=> 8
这是我使用的 Ruby 版本:
$ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]
我正在学习 Ruby 并查看了Array#map
这里的文档,它说语法如下
map {|element| ... } → new_array
map → new_enumerator
但是我们可以arr.map(&:to_s)
对数组的每个元素进行字符串化。据我所知,&:to_s
这只是语法糖:to_s.to_proc
(如此处所示),这意味着 map 接受一个Proc
对象作为参数。但它的函数签名却并非如此。
我对此有几个疑问。
有人可以解释这种行为并指出相关文档吗?
在这种情况下到底是什么Proc
意思? 这不是to_s
底层类的方法吗? 对于我来说,传递一个没有关于将要调用的底层类Proc
的信息的对象意味着什么。to_s
任何帮助都将非常有帮助!
使用 rspec-expectations 3.13.3 并具有如下代码:
def methname(**kwargs)
# let's assume this method doesn't mind whether the kwargs are keyed by symbols or strings
p(received: kwargs)
end
使用如下测试
expect(something).to receive(:methname).with(hash_including(what_ever: "else"))
但在某些情况下,关键字参数被创建为字符串,而不是符号,因此失败了,我必须这样做
expect(something).to receive(:methname).with(hash_including("what_ever" => "else"))
我可以在每个规范中做到这一点,但如果我可以无差别地匹配它,对我来说会更干净 -
# desired code
expect(something).to receive(:methname).with(hash_including_indifferently(what_ever: "else"))
有没有办法可以做到这一点?
在 vanilla ruby 中,如果我在默认主范围内创建方法:
def asdf
puts "asdf"
end
def qwer
puts "qwer"
end
我该如何列出这些功能?
我尝试了以下方法,但没有成功:
methods.grep(/asdf|qwer/)
self.methods.grep(/asdf|qwer/)
Object.methods.grep(/asdf|qwer/)
Object.instance_methods.grep(/asdf|qwer/)
我在 Windows 10 上运行 ruby,通过https://scoop.sh/安装:
> ruby --version
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x64-mingw-ucrt]
我用 Ruby 编写了一个凯撒密码加密程序。当我传入包含小写字符的字符串时,它似乎工作正常,直到我传入包含大写字符的字符串。每当我传入包含大写字符的字符串时,代码就会在行间引发 NoMethodError main.rb:7:in block in `caeser_cipher': undefined method `+' for nil (NoMethodError)
。
这是我的代码:
def caeser_cipher(string, key)
alphabet = ('a'..'z').to_a
cipher = ""
string.each_char do |char|
if alphabet.include?(char.downcase)
new_key = (alphabet.index(char) + key) % 26
char = alphabet[new_key]
end
cipher << char
end
cipher
end
puts "Enter whatever you please (of course a string of text) that you want encrypted!!!"
text = gets.chomp
puts "And then the offset value"
num = gets.chomp.to_i
puts caeser_cipher(text, num)
我尝试包装char = alphabet[new_key]
另一个 if 条件来检查char == char.upcase
,如果结果为真,则执行此操作,char = alphabet[new_key].upcase
但也失败了。