Tag: 变量赋值

赋值符号是如何工作的 – Ruby

在Ruby中如果我只是分配一个局部变量。 sound = “bang”. 是一个main.sound=(“bang”)方法? 如果是这样,那个方法“sound =”在哪里以及如何定义? 或者这项任务如何运作? 如果没有,实际发生了什么? 我知道对于一个setter方法,你会说x.sound =(“bang”)。 并且您使用参数“bang”在对象“x”上调用方法“sound =”。 你正在创建一个实例变量“声音”。 我可以想象所有这一切。 但不是在“主”对象中分配变量时。 据我所知,它不是Object类的实例变量……或者是它? 我很困惑。

从ruby内部进行施工质量分配

可能重复: 在ruby中创建惯用对象 有时,在构造上为实例变量分配许多构造的参数是有用的。 除了明显的方法: def initialize(arg1, arg2, arg3) @arg1, @arg2, @arg3 = arg1, arg2, arg3 end 是否有更简洁的习惯用于实现相同的结果? 像scala中发现的东西,例如: class FancyGreeter(greeting: String) { def greet() = println(greeting) } 在这种情况下,对象FancyGreeter有一个默认构造函数,为它传递的参数提供赋值。

一元运算符的运算符优先级

关于运算符优先级的一些信息源就像这样说一元运算符就像! , ~ , + , -优先级高于赋值= 。 但是,以下表达式是可能的: !a = true # => false (with warning) a # => true ~a = 1 # => -2 a # => 1 +a = 1 # => 1 a # => 1 -a = 1 # => -1 a # => 1 考虑到这些结果,我能想到的唯一可能的解释是这些一元运算符的优先级低于赋值。 如果是这种情况,则意味着我上面提到的信息是错误的。 哪个是对的? 有不同的解释吗?

为什么单个`=`在`if`语句中工作?

此代码作为示例提供,用于与devise和OmniAuth一起使用,它可以在我的项目中使用 。 class User < ActiveRecord::Base def self.new_with_session(params, session) super.tap do |user| if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] user.email = data["email"] if user.email.blank? end end end end 我不知道为什么它是一个单一的等号作为一个双等号,我认为这对于if -statements是必要的。 我的IDE“intelliJ IDEA”同意我的担忧。

NameError:undefined – 在Ruby 2.1.2中更改了局部变量的解析规则吗?

我得到NameError: undefined local variable or method使用ruby 2.1.2的NameError: undefined local variable or method 正如在这个问题中观察到的,表达式如: bar if bar = true 引发未定义的局部变量错误(假设事先未定义bar ),因为解析器在分配之前会读取bar 。 而且我相信这个表达与以前没有区别: bar if bar = false 两者之间的区别在于主体是否被评估,但是如果遇到未定义的局部变量,则在评估条件之前立即引发错误并不重要。 但是当我在Ruby 2.1.2上运行第二个代码时,它不会引发错误。 它之前是这样吗? 如果是这样,那么解析讨论的内容是什么? 如果没有,Ruby规范是否已更改? 有没有提到这个? 它在1.8.7,1.9.3等中做了什么?

条件“if”修饰符中的Ruby变量赋值

我有一个关于Ruby解释器如何分配变量的问题: 我经常使用这个: return foo if (foo = bar.some_method) some_method返回一个对象或nil。 但是,当我尝试这个: return foo if (true && (foo = bar.some_method)) 我得到:NameError:未定义的局部变量或方法foo for main:Object。 导致第二行出错的第一行和第二行之间的评估有何不同?

对象分配和指针

我对Ruby中的对象赋值和指针有点困惑,并编写了这个代码片段来测试我的假设。 class Foo attr_accessor :one, :two def initialize(one, two) @one = one @two = two end end bar = Foo.new(1, 2) beans = bar puts bar puts beans beans.one = 2 puts bar puts beans puts beans.one puts bar.one 我曾经假设当我将bar分配给bean时,它会创建一个对象的副本,而修改一个不会影响另一个。 唉,输出显示不然。 ^_^[jergason:~]$ ruby test.rb # # # # 2 2 我相信数字与对象的地址有关,而且对于bean和bar都是相同的,当我修改bean时,bar也会被改变,这不是我所期望的。 看来我只是创建一个指向对象的指针,而不是它的副本。 在分配时复制对象而不是创建指针需要做什么? 使用Array类进行的测试也显示了一些奇怪的行为。 foo […]

Ruby 1.9.2中“|| =”做了什么?

params[:user][:role_ids] ||= [] 它有什么作用? ruby -v = 1.9.2p290

解析与操作的可变范围和顺序:“if”中的赋值

我的理解是,行前面的if语句在行前面的代码之前进行了评估: ‘never shown’ if (false) 并且可以在if语句中进行赋值。 ‘shown’ if (value = ‘dave is king’) value #=> “dave is king” 并且,当分配了不存在的变量时,将创建该变量。 事先不需要它存在。 这是真的? 如果所有这些假设都是真的,为什么会失败呢? error_array < undefined local variable or method `error’ for 它在数组推右前分配给错误? 我想了解什么时候进行评估。 这个确实有效: if (error = import_value(value)) error_array << error end 现在我真的很困惑。

如果hash 不存在,如何分配hash =’c’?

有什么比这简单的方法 if hash.key?(‘a’) hash[‘a’][‘b’] = ‘c’ else hash[‘a’] = {} hash[‘a’][‘b’] = ‘c’ end