在Ruby中,如何复制变量以使原始更改不影响副本?
例如:
phrase1 = "Hello Jim"
phrase2 = phrase1
phrase1.gsub!("Hello","Hi")
p phrase2 #outputs "Hi Jim" - I want it to remain "Hello Jim"
Run Code Online (Sandbox Code Playgroud)
在这个例子中,两个变量指向同一个对象; 我想为第二个变量创建一个新对象,但最初它包含相同的信息.
我试图填充四个元素的数组,正整数小于9.
这是我的代码:
generated_number=Array.new(4)#create empty array of size 4
generated_number.each do |random| #for each position in the array create a random number
random=rand(10)
end
puts generated_number
Run Code Online (Sandbox Code Playgroud)
我不明白我错过了什么.
我从其他客户端发送一个数组,并收到它像这样: "[1,2,3,4,5]"
现在我只想将它转换为Array而不使用Ruby的eval 方法.我们可以使用任何Ruby的默认方法吗?
"[1,2,3,4,5]" => [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud) 在红宝石heredoc:
a = <<~TEXT
asd
asd
TEXT
Run Code Online (Sandbox Code Playgroud)
它会产生:
[21] pry(main)> a = <<~TEXT
[21] pry(main)* asd
[21] pry(main)* asd
[21] pry(main)* TEXT
=> "asd\n" + "asd\n"
Run Code Online (Sandbox Code Playgroud)
它\n在字符串的末尾生成一个,如何避免这种情况?
如果我匹配带有十个捕获的正则表达式:
/(o)(t)(th)(f)(fi)(s)(se)(e)(n)(t)/.match("otthffisseent")
Run Code Online (Sandbox Code Playgroud)
然后,因为$10,我得到:
$10 # => "t"
Run Code Online (Sandbox Code Playgroud)
但它缺少了global_variables.我得到(在irb会话中):
[:$;, :$-F, :$@, :$!, :$SAFE, :$~, :$&, :$`, :$', :$+, :$=, :$KCODE, :$-K, :$,,
:$/, :$-0, :$\, :$_, :$stdin, :$stdout, :$stderr, :$>, :$<, :$., :$FILENAME,
:$-i, :$*, :$?, :$$, :$:, :$-I, :$LOAD_PATH, :$", :$LOADED_FEATURES,
:$VERBOSE, :$-v, :$-w, :$-W, :$DEBUG, :$-d, :$0, :$PROGRAM_NAME, :$-p, :$-l,
:$-a, :$binding, :$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9]
Run Code Online (Sandbox Code Playgroud)
这里只列出前九个:
$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9
Run Code Online (Sandbox Code Playgroud)
这也得到以下证实:
global_variables.include?(:$10) # …Run Code Online (Sandbox Code Playgroud) 运行:
require 'date'
y = Date.new
puts "default year is #{y.year}"
Run Code Online (Sandbox Code Playgroud)
输出:
default year is -4712
Run Code Online (Sandbox Code Playgroud)
Date对象的年份默认为-4712有什么特别的原因吗?我想也许有一个技术(或传统)的原因.我用Google搜索这一点,看它的Ruby文档(2.2.3)上,我不能看到一个答案,为什么.
在Eloquent Ruby(第21页,第一版,第六版)中,作者(Russ Olsen)主张使用该each方法而不是for循环,这与我在其他地方阅读的所有内容一致.
然而,作者还接着说,这样做的一个原因是for循环实际上调用了each方法,那么为什么不切断中间人并使用each呢?所以我想知道这实际上是如何工作的.
为了调查我确实搜索了github上的Ruby repo,但发现很难确定我在哪里/如何看到这个行动.
重申一下这个问题:
如何显示Ruby for循环实际上是使用该each方法实现的?
如何"g"从字符串中删除除字符之外的所有字符,数字和符号,并将其替换为" "?
string = "bi2gger 1is 00ggooder"
Run Code Online (Sandbox Code Playgroud) 创建一个具有构造函数和方法的类Square来计算正方形的面积.
class Square
def initialize(side)
@side = side
end
def printArea
@area = @side * @side
puts "Area is: #{@area}"
end
end
Run Code Online (Sandbox Code Playgroud)
创建2个对象并将它们添加到数组中
array = []
array << Square.new(4)
array << Square.new(10)
for i in array do
array[i].printArea
end
Run Code Online (Sandbox Code Playgroud)
我如何访问数组中的对象?我收到一个错误:没有将Square隐式转换为整数.
登录到应用程序然后完全关闭浏览器后,我重新打开希望注销的浏览器.但是我还在登录?
我在8.2.3节中更改布局链接,除此之外,应用程序按预期运行并运行.代码也是教程中的代码.我认为这些是相关文件:
应用程序/佣工/ sessions_helper.rb
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Returns the current logged-in user (if any).
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
end
Run Code Online (Sandbox Code Playgroud)
应用程序/控制器/ sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user
else
flash.now[:danger] = 'Invalid …Run Code Online (Sandbox Code Playgroud)