学习红宝石.我的印象是布尔属性应该如下命名:
my_boolean_attribute?
Run Code Online (Sandbox Code Playgroud)
但是,尝试执行以下操作时出现语法错误:
class MyClass
attr_accessor :my_boolean_attribute?
def initialize
:my_boolean_attribute? = false
end
end
Run Code Online (Sandbox Code Playgroud)
红宝石显然很讨厌"?".这是惯例吗?我究竟做错了什么?
编程和Ruby的新手,我希望关于符号的这个问题符合要求.据我所知,在红宝石的符号(如:book,:price)是特别有用的哈希键,以及全能做的是字符串可以做的事情一个轻量级的,特定子集.
但是,我在一方面对符号感到困惑.具体来说,当它们在attr_accessor方法类型中使用时,它们看起来更像是一个变量.例如,attr_reader :book, :price.
如果它们是该用法中的变量,那么这有点令人费解,因为它们通常不在变量类型中列出(如$ global,@ instance,local,@@ class,有时候,CONSTANT,变量类型)变量类型被描述.
如果符号是以这种方式使用的变量,那么应该对它们有什么范围?或者它们在这种情况下仍然是某种轻量级的字符串?(或者也许以更广泛的方式,符号,字符串和变量都具有基本的鸭子性质?)提前感谢您的见解和建议.
@var_name在 ruby 中,您可以直接通过或通过 private getters在内部访问变量attr_reader :var_name。
哪种解决方案更(语义上?)正确?使用解决方案 1 或解决方案 2 有什么优点/缺点?
解决方案一:
class Point
def initialize(x, y)
@x = x
@y = y
end
def distance
Math.sqrt(@x ** 2 + @y ** 2)
end
end
Run Code Online (Sandbox Code Playgroud)
解决方案2:
class Point
def initialize(x, y)
@x = x
@y = y
end
def distance
Math.sqrt(x ** 2 + y ** 2)
end
private
attr_reader :x, :y
end
Run Code Online (Sandbox Code Playgroud) 我正在查看instance_variable_set的文档,并看到给出的示例代码执行此操作:
obj.instance_variable_set(:@instnc_var, "value for the instance variable")
Run Code Online (Sandbox Code Playgroud)
然后允许您在任何类的实例方法中以@instnc_var访问变量.
我不知道为什么需要有一个冒号:前的@instnc_var.结肠做什么?
在以下示例中,我不了解attr_reader或这样的关键字property:
class Voiture
attr_reader :name
attr_writer :name
property :id, Serial
property :name, String
property :completed_at, DateTime
end
Run Code Online (Sandbox Code Playgroud)
它们如何工作?如何创建自己的?它们是功能,方法吗?
class MyClass
mymagickstuff :hello
end
Run Code Online (Sandbox Code Playgroud) 以"="结尾的ruby方法是什么意思?
请参阅此打印输出中的可用方法:
2.2.0 :066 > obj.methods(false)
=> [:label=, :label, :description=, :description, :thumbnail=, :thumbnail, :attribution=, :attribution, :license=, :license, :logo=, :logo, :see_also=, :seeAlso=, :see_also, :seeAlso, :related=, :related, :within=, :within, :metadata=, :metadata, :sequences=, :sequences, :structures=, :structures, :viewing_hint=, :viewingHint=, :viewing_hint, :viewingHint, :viewing_direction=, :viewingDirection=, :viewing_direction, :viewingDirection, :service=, :service]
Run Code Online (Sandbox Code Playgroud)
例如,label =和label之间的区别是什么?
我已经创建了一个Person类,我的代码是正确的,但我只是想让某人澄清一个特定的行.
class Person
attr_reader :first_name, :last_name, :age
def initialize (first_name, last_name, age)
@first_name = first_name
@last_name = last_name
@age = age
end
end
Run Code Online (Sandbox Code Playgroud)
我很困惑的是那条线attr_reader.为什么需要包含这个,为什么我需要:在每个属性之前?
ruby ×8
class ×2
accessor ×1
attributes ×1
conventions ×1
object ×1
oop ×1
properties ×1
symbols ×1
variables ×1