Project

General

Profile

Feature #6806

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

=begin 
 What would you say about this proposal?    Is there a better alternative? 

 I suggest to support functional programming in Ruby by making module methods called with `ModuleName::method_name` (({ModuleName::method_name})) syntax raise an exception if the method uses instance or class variables (instance variables of the singleton class, of course). 
 If i understand correctly, currently `ModuleName::method_name` (({ModuleName::method_name})) and `ModuleName.method_name` (({ModuleName.method_name})) behave identically, so i propose that they be different: 

 ~~~ruby 
 

  module M 
   
    module_function 
     
      def f(x) 
       
        x*x 
     
      end 
     
      def g(x) 
       
        @x ||= x 
       
        @x*@x 
     
      end 
 
  end 

 

  M.f(2) # => 4 
 
  M.g(2) # => 4 
 
  M::f(3) # => 9 
 
  M::g(3) # => Error: instance variable `@x` used in a functional call `M::g` 
 ~~~ 

 Current behavior: 

 ~~~ruby 
 

  M.f(2) # => 4 
 
  M.g(2) # => 4 
 
  M::f(3) # => 9 
 
  M::g(3) # => 4 
 ~~~ =end 

Back