试试开档时设定编码 这样读档问题较小 如果要算 bytesize "string".bytesize
File.open('aa.log',encoding: 'GBK').each {|line| puts line,line.enocde('utf-8') }
File.foreach('aa.log',encoding: 'GBK') {|line| puts line}
感谢 @qiumaoyuan 的答覆,当初的想法是:父类做抽象接口,子类:实现的 METHOD 用 PRIVATE METHOD,才有这个问题;是否有能够判定子类没有将该方法设定为 private 的警告。
@bysxiang java 的 private 和 RUBY private 不同吧 父类的 private 子类是调用不到的,必须调用继承自父类的 public method,透过调用到 父类的 public method , 才可能调用到 private method
而 ruby 在继承后 子类的 public method 是直接可以调用父类的 private method 的 从 子类的 private_methods 可以看到, 也就是说 子类 可以新增 public method 来调用 父类的 private method
class A
private
def a
4
end
end
class B
def b
a
end
end
b=B.new
b.b # 4
@miao 我想 你是想知道因为没有同名异式 方法 如何利用引用参数来 达到同名异式的效果吧
参数引用优先顺序 是 一般数 hash block
def test(*args)
a,*b=args
p a
p b
if block_given?
b.each { |i| yield i }
end
end
def test1(a,b,c,&block)
p a , b ,c
block.call()
end
def test2(a,b,c)
p a,b,c
yield
end
test( 1,2,3,a: 1,b:2,c:3) {|i| p i } # 传入引数 [1,2,3,{a:1,b:2,c:3} ]
# a=1 b=[2,3,{a:1,b:2,c:3}]
def test1(argv)
a=argv[:a]
b=argv[:b]
end
test1(a:1 , b:2 ,c:3) # 此时 参数被当做 1 个 Hash
@bysxiang @sanm1992 啊真的吗? 我是用 2.5.3 2.4 2.3 应该也是可以 以前 试过 ruby method 在 self 找不到 方法会向上找 实际上 并没有覆盖,而是 子类 也有同样名字的方法,的方法 参照到 子类的方法 如果用 undef 把子类的方法拿掉 当找不到方法就会向上去找
比较特别的是 B 类找不到本身的 b 方法 呼叫 A 类 的 b 方法 , A 类 b 方法内的 c 却是 B 类的 c 方法
这样讨论后,自己也有深一点的理解。
class A
def a
4
end
def b
a + c
end
private
def c
3
end
end
class B < A
private
def c
50
end
end
a=A.new
a.b # a.a +a.b
b=B.new
b.b 使用 a.b 调用到 a.a 及b.c
'''
@pinewong
刚才试了一下 inherited , 是在 subclass 建立时 执行,class block 内容是在 inherited 之后,这样就无法确认子类 宣告的 方法
class Foo
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
end
class Bar < Foo
def a
3
end
puts "class #{self}"
end
class Baz < Bar
puts "class #{self}"
def a
3
end
end
#New subclass: Bar
#class Bar
#New subclass: Baz
#class Baz
@tuliang : 如果子类 重定义 initialize 且没有 super 时 又会被 pass 掉; 在想 能否在 建立 class 时就能检查
利用 class method : private_instance_methods & public_instance_methods
def initialize 好像就会自动调回 private_method 这个方法 不知道在那里?
没有用,已经 extend 的 module 直接跳过 顺序不变 ( 和 module include 一样,已经载入的 module 不会再载入且顺序不变) 仍然是 C -> B -> A
def max(*args)
args.max # args == Array
end
max( 3,4,5,8,6)
``