From: Shugo Maeda Date: 2010-12-03T14:55:35+09:00 Subject: [ruby-core:33539] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods Hi, 2010/12/2 Yusuke ENDOH : >> My proposal is to use modules as namespaces for refinements. �So >> indentation is a necessary evil. �Otherwise, we need syntax like Java >> packages and one file for each package. > > I'm not against using modules as namespaces and refinement scope, > but I don't like to see the same module being used for refinement > and traditional use at the same time. > Modules for mix-in, modules for collection of helper methods, and > modules for refinement should be separated, at least, in casual > use. I agree with you. But I don't think Ruby should enforce it. > We can clearly see that the following module FooExt is only for > refinement. �Thus I like this style. > > �module FooExt > � �refine Foo > � �def ... end > �end I don't like this style as the primary way because it can be used for only one class. A namespace should be able to have multiple names. >>> A longer (more "meta-programming-like") name would be appropriate to >>> the block style, such as Module#refine_class, #refine_class_eval, >>> #class_eval_with_refinement. >> >> Meta-programming means programming on programs, so the non-block style >> is also a meta-programming feature. �Why should only the block style >> be named more "meta-programming-like"? > > I can call it "not for casual use" instead of "meta-programming- > like." I see. >> Could you tell me why >> >> �refine Foo >> � �def bar; end >> �end >> >> is good but >> >> �refine Foo do >> � �def bar; end >> �end >> >> is not so good? > > Because block includes method definition. �A block looks to me > "dynamic" behavior, while method definition (using `def' keyword) > looks "static" behavior. > Of course I know that both are also evaluated dynamically in > Ruby, but I don't think that Ruby encourages such a style so much. method definitions don't look static for me, but nari said the same.... My brain might be too optimized for Ruby. >> I don't know why meta-programming features should have long names. >> In Ruby, meta-programming is encouraged, and meta-programming features >> sometimes have a short name such as eval, but rarely have a keyword. > > Ah, we found the perception gap between I and you. > I do NOT think that meta-programming is so encouraged even in Ruby. > It is like "a trick," and should be used only when it is appropriate. > If it was really so encouraged, Ruby would not provide many > syntax, such as `def' and `class.' > > And I guess that "eval" just came from Perl. I guess it's a problem of the term meta-programming, so let's not use the word. What I want to say is that I think use frequency of refine is not so high to require a new keyword, but enough high to have a nice method name. To tell the truth, I can accept new keywords refine and using, but I'm afraid it makes Refinements a Ruby 2.0 feature. -- Shugo Maeda