51dev.com IT技术开发者社区

51dev.com 技术开发者社区

从python入门ruby

代码星球阅读(45)2020-10-14 收藏0次评论

1、Ruby的函数可以不使用括号

def h(name)
    puts "hello #{name}"
end

h "jack"

 

2、python可以直接访问实例的属性,ruby不行,且Ruby的类名必须以大写字母开头

为什么python需要self:假如创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) ,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)

self在Python里不是关键字。self代表当前对象的地址。 

>>> class greeter:
...     def __init__(self,name):
...             self.name=name
... 
>>> g=greeter("jack")
>>> g.name
'jack'
>>> 
class Greeter
   def initialize(name)
     @name = name
     end
   end
 => :initialize 
g = Greeter.new("jack")

  无论是g.name还是g.@name都会报错。在Ruby中,实例变量是被隐藏起来的,但是可以通过为类添加访问属性的方法来获取属性值。把一个类打开然后改变它,会对以后生成的甚至是已经生成的对象产生即时效果。 

 class Greeter
   attr_accessor :name
   end
 => nil 
g.name
=> "jack"

  attr_accessor 会自动为我们定义两个新的函数, name 用来读取变量的值, name= 用来给变量赋值。在改变了类之后,我们之前创建的Greeter的实例g也被改变了,能够通过g.name访问name属性了

 

3、ruby并不是严格缩进的,下面这样的代码也可以运行

class MegaGreeter
attr_accessor :names

def initialize(names = "World")
  @names = names
end
end

 

4、ruby判断真值时,只有 false 和 nil 当做假值。其余一切皆为真(包括 0、 0.0、 "" 和 [])。

a=0
if a
   puts "yes"
else
   puts "no"
end

=>yes

 

5、优雅的循环

@names.each do |name|
  puts "Hello #{name}!"
end
for name in names:
    print("Hello %s!"%name)

Ruby 的方法对比来看就更清爽,所有的清理工作都被隐藏在 each 函数里了, 您只需要告诉它您想做什么。在 each 函数内部,实际上会去自动调用 yield "Albert"yield "Brenda"yield "Charles",等等。 

 

6、ruby不限制函数所支持的参数类别。 如果有人写了一个新的类,只要它像其他列表类一样回应 join 这个函数, 那它就可以被相应的其他函数所使用。 

if @names.respond_to?("join")
if callable(getattr(greeter,"join",None)):

 

7、“如果这是启动脚本”

if __name__ == '__main__':
if __FILE__ == $0

 

8、ruby的表达式和语句没有区别。任何表达方法都有返回值

 

9、类似 Python, 从 Ruby 2.0 开始,可以使用关键字参数定义方法

 

10、nil is a object

  def test_nil_is_an_object
    assert_equal true, nil.is_a?(Object), "Unlike NULL in other languages. 
                                            But, like None in python."
  end

 

以上就是从python入门ruby的全部内容。